CF617E
不难的莫队。有些代码细节要注意。
由于每个询问区间的左端点要减一,所以左端点可能是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;
}
一如既往,万事胜意