617E - XOR and Favorite Number

xiaoxiao2021-02-28  161

莫队,用统计每个块内每个值出现了几次。 对数列进行前缀异或和,每个查询因此相当于问a[l-1]^a[r]是否为k。 因此l移动时统计a[l-1]^k出现的次数,r移动时统计a[r]^k出现的次数。 没了。 傻逼一样不知道调些什么。 #include<cstdio> #include<cstring> #include<iostream> #include<cmath> #include<map> #include<vector> #include<algorithm> using namespace std; #define rep(i,j,k) for(i=j;i<=k;++i) #define per(i,j,k) for(i=j;i>=k;--i) #define sqr(x) ((x)*(x)) #define G getchar() #define LL long long #define pll pair<LL,LL> #define mkp make_pair #define X first #define Y second #define N 100005 #define inf 2000005 struct QUERY{int L,R,wz;}qu[N]; int n,m,k,a[N],s,t,mo[N],cnt[inf]; LL ans[N],now; int read(){ int x=0;char ch=G; for(;ch<48||ch>57;ch=G); for(;ch>47&&ch<58;ch=G)x=x*10+ch-48; return x; } bool cmp(QUERY x,QUERY y){ return mo[x.L]==mo[y.L]?x.R<y.R:mo[x.L]<mo[y.L]; } int main(){ int i,l,r; n=read();m=read();k=read(); s=ceil(sqrt(n)); rep(i,1,n)mo[i]=t+=i%s==1,a[i]=read()^a[i-1]; rep(i,1,m){ l=read();r=read();qu[i]=(QUERY){l,r,i}; } sort(qu+1,qu+m+1,cmp); l=r=qu[1].L;now=k==(a[l-1]^a[r]); rep(i,1,m){ while(r<qu[i].R){ ++cnt[a[r++]]; now+=cnt[a[r]^k]; if((a[l-1]^a[r])==k)++now; } while(r>qu[i].R){ now-=cnt[a[r]^k]; if((a[l-1]^a[r])==k)--now; --cnt[a[--r]]; } while(l>qu[i].L){ ++cnt[a[--l]]; now+=cnt[a[l-1]^k]; if((a[l-1]^a[r])==k)++now; } while(l<qu[i].L){ now-=cnt[a[l-1]^k]; if((a[l-1]^a[r])==k)--now; --cnt[a[l++]]; } ans[qu[i].wz]=now; } rep(i,1,m)printf("%lld\n",ans[i]); return 0; }
转载请注明原文地址: https://www.6miu.com/read-25376.html

最新回复(0)