CF617E

link

不难的莫队。有些代码细节要注意。

由于每个询问区间的左端点要减一,所以左端点可能是0.这本不是什么大问题,初始的时候把两个指针错开就可以了。但一开始写的时候我这个sb加了个特殊处理,然后wa而不自知。另外就是data的下标应该开到元素数量的两倍,因为两个数异或很可能比两个数都大。

莫队写得很丑跑的很慢,但可以接受。

#include<bits/stdc++.h>
//#define feyn
#define int long long
const int N=100010;
const int M=2000010;
using namespace std;
inline void read(int &wh){
	wh=0;int f=1;char w=getchar();
	while(w<'0'||w>'9'){if(w=='-')f=-1;w=getchar();}
	while(w<='9'&&w>='0'){wh=wh*10+w-'0';w=getchar();}
	wh*=f;return;
}

int m,n,num,a[N];
struct node{
	int l,r,id;
}b[N];

int size,data[M],an[N],ans;
inline bool cmp(node s1,node s2){
	return s1.l/size==s2.l/size?s1.r<s2.r:s1.l/size<s2.l/size;
}
inline void add(int wh){
	ans+=data[(a[wh]^num)];
	data[a[wh]]++;
}
inline void del(int wh){
	data[a[wh]]--;
	ans-=data[(a[wh]^num)];
}

signed main(){
	
	#ifdef feyn
	freopen("in.txt","r",stdin);
	#endif
	
	read(m);read(n);read(num);
	for(int i=1;i<=m;i++){
		read(a[i]);a[i]=a[i-1]^a[i];
	}
	for(int i=1;i<=n;i++){
		read(b[i].l);read(b[i].r);
		b[i].id=i;b[i].l--;
	}
	size=ceil(sqrt(m));
	sort(b+1,b+n+1,cmp);
	int l=1,r=0;
	for(int i=1;i<=n;i++){
		while(r<b[i].r)add(++r);
		while(l>b[i].l)add(--l);
		while(r>b[i].r)del(r--);
		while(l<b[i].l)del(l++);
		an[b[i].id]=ans;
	}
	for(int i=1;i<=n;i++)printf("%lld ",an[i]);
	
	return 0;
}
posted @ 2022-07-07 11:09  Feyn618  阅读(25)  评论(0编辑  收藏  举报