#莫队# [luogu SP3267] DQUERY - D-query

Title

SP3267 DQUERY - D-query


Solution

注意使用位运算的优先级顺序

https://www.cnblogs.com/WAMonster/p/10118934.html


Code

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#define rep(i,x,y) for(int i=x;i<=y;i++)
using namespace std;
const int N=1e6+5; 
int n,m,b[N],a[N],s,num,cnt[N],val=0,ans[N];
struct node{
	int l,r,id; 
}q[N]; 
bool cmp(node x,node y){
	return (b[x.l]^b[y.l])?b[x.l]<b[y.l]:((b[x.l]&1)?x.r<y.r:x.r>y.r); 
}
int main(){
	scanf("%d",&n); 
	s=(int)sqrt(n); num=ceil((double)n/s); 
	rep(i,1,num) rep(j,(i-1)*s+1,i*s) b[j]=i; 
	rep(i,1,n) scanf("%d",&a[i]); 
	scanf("%d",&m); 
	rep(i,1,m) scanf("%d%d",&q[i].l,&q[i].r),q[i].id=i; 
	sort(q+1,q+m+1,cmp); 
	int l=1,r=0; 
	rep(i,1,m){
		int ql=q[i].l,qr=q[i].r; 
		while (l>ql) val+=!cnt[a[--l]]++;
		while (l<ql) val-=!--cnt[a[l++]]; 
		while (r>qr) val-=!--cnt[a[r--]]; 
		while (r<qr) val+=!cnt[a[++r]]++; 
		ans[q[i].id]=val; 
	}
	rep(i,1,m) printf("%d\n",ans[i]); 
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值