codeforces 703d
问题
区间[l,r]出现偶数次数的数字的异或和
a[i]<1e9;l,r,q<1e6;
由 x xor x=0;a xor 0=a;
1.区间直接异或和 为出现奇数次的数异或和
2.区间内所有不同数的异或和
1异或2就是出现偶数次数的异或和。
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=4E6+777; 4 const int M=1e6+77; 5 long long s[M]; 6 long long v[N],a[N],dv,ql,qr; 7 struct re{ 8 long long r; 9 long long l; 10 int id; 11 }q[M]; 12 bool cmp(re x,re y){ 13 return x.r<y.r||(x.r==y.r&&x.l<y.l);} 14 long long m,n;int ans[M]; 15 long long az,j; 16 map<int,int>ha; 17 void mk(int o,int l,int r){ 18 if(l==r&&l==az){v[o]^=dv;return;} 19 long long mid=(r+l)/2; 20 if(mid>=az)mk(o*2,l,mid); 21 else mk(o*2+1,mid+1,r); 22 v[o]=v[o*2]^v[o*2+1]; 23 } 24 long long as; 25 void qz(int o,int l,int r){ 26 if(ql<=l&&r<=qr){as^=v[o];} 27 else{long long mid=(r+l)/2; 28 if(ql<=mid)qz(o*2,l,mid); 29 if(mid<qr)qz(o*2+1,mid+1,r);} 30 } 31 int main(){ 32 // freopen("p.in","r",stdin); 33 //freopen("p.out","w",stdout); 34 ios::sync_with_stdio(0); 35 cin>>n; 36 for(int i=1;i<=n;i++) 37 {cin>>a[i];s[i]=s[i-1]^a[i];} 38 cin>>m; 39 for(int i=1;i<=m;i++){ 40 q[i].id=i; 41 cin>>q[i].l>>q[i].r; 42 } 43 sort(q+1,q+1+m,cmp); 44 j=1; 45 for(int i=1;i<=n;i++){ 46 dv=a[i]; 47 az=i; 48 mk(1,1,n); 49 if(ha[a[i]]){az=ha[a[i]];mk(1,1,n);} 50 ha[a[i]]=i; 51 while(j<=m&&q[j].r==i){ 52 as=s[i]^s[q[j].l-1]; 53 ql=1;qr=i; 54 qz(1,1,n); 55 ql=1;qr=q[j].l-1; 56 if(qr>0)qz(1,1,n); 57 ans[q[j].id]=as; 58 j++; 59 } 60 61 } 62 for(int i=1;i<=m;i++)printf("%d\n",ans[i]); 63 return 0; 64 }
UPD:少袄夜,戒躁
戒骄戒躁