这题稍微分析就能发现实际这个题就是求区间异或和异或上区间不同数的异或和,因此直接转化为HH的项链。
代码:
#include #include #include #include #include #define lowbit(x) x&-x const int N=1e6+5; using namespace std; typedef pair PII; struct node { int l,r,id; node(int ll,int rr,int ii) { l=ll;r=rr;id=ii; } node(){ } friend bool operator < (node a,node b) { if(a.r==b.r) return a.l mp; namespace fenwick { struct fwt { int s; }fw[N]; int query(int x) { int ret=0; for(int i=x;i;i-=lowbit(i)) ret^=fw[i].s; return ret; } void modify(int x,int z) { for(int i=x;i<=n;i+=lowbit(i)) fw[i].s^=z; } } using namespace fenwick; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); b[i]={a[i],i}; sum[i]=sum[i-1]^a[i]; if(!mp.count(a[i])) mp[a[i]]=i; } /* sort(b+1,b+1+n); int last=-1,tot=1; for(int i=1;i<=n;i++) { if(last!=b[i].first) tot=i,last=b[i].first; num[b[i].second]=tot; } */ scanf("%d",&m); for(int i=1;i<=m;i++) scanf("%d %d",&e[i].l,&e[i].r),e[i].id=i; sort(e+1,e+1+m); int head=1; for(int i=1;i<=m;i++) { while(head<=e[i].r) { if(t[mp[a[head]]]) modify(t[mp[a[head]]],a[head]); modify(head,a[head]); t[mp[a[head]]]=head; head++; } head=e[i].r+1; ret[e[i].id]=(query(e[i].r)^query(e[i].l-1)^sum[e[i].r]^sum[e[i].l-1]); } for(int i=1;i<=m;i++) printf("%d\n",ret[i]); return 0; }