传送门
题意:
给你一个序列和m次询问,每次询问给出一个l,r,问这个区间内出现偶数次数的数的异或和
思路:
我们想想,一个数如果出现了偶数次,那么这偶数次异或起来就是0,奇数次异或起来就是它本身,现在我们让a[l],a[l+1]…a[r]异或起来,再异或区间内存在的数(即再异或一个区间内不同数的异或和),那原来在区间出现偶数次的数,再异或一个它本身,不就是它本身了,而出现奇数次的数,异或它本身,就是0,所以总的来看,这两部分异或起来,区间出现偶数次的数才会对答案产生贡献 ,比如
(
1
⨁
2
⨁
2
⨁
3
)
⨁
(
1
⨁
2
⨁
3
)
=
2
(1bigoplus2bigoplus2bigoplus3)bigoplus(1bigoplus2bigoplus3)=2
(1⨁2⨁2⨁3)⨁(1⨁2⨁3)=2
那这种区间不同数的异或和,求和,求个数和等等,用树状数组做是比较好写的,先把m次询问按照右端点排个序,进行树状数组的操作,再离线询问。
#includeusing namespace std; const int N=1e6+5; int a[N]; int c[N]; int ans[N]; int sum[N]; int n; map pos; template void read(T&num) { char CH; bool F=false; for(CH=getchar();CH<'0'||CH>'9';F= CH=='-',CH=getchar()); for(num=0;CH>='0'&&CH<='9';num=num*10+CH-'0',CH=getchar()); F && (num=-num); } struct node{ int l,r; int id; bool operator<(const node &x)const{ return r



