codeforces 703D

    xiaoxiao2025-01-09  11

    题意:求区间出现偶数次的数的异或值。序列长度是1000000,操作是1000000.

    题解:求出区间不同的数的异或值,然后区间异或值^不同的数的异或值 = 出现偶数次的数的异或值。不同数的异或值用离线的方式处理,用树状数组维护。

    #include<bits/stdc++.h> using namespace std; class FenWick{ private: int n; vector<int> d; public: void init(int n){ this->n = n+1; d = vector<int>(this->n,0); } int lowbit(int x){ return x&-x; } void add(int p,int x){ while(p<n){ d[p]+=x; p+=lowbit(p); } } void xor_add(int p,int x){ // cout<<p<<"----"<<x<<endl; while(p<n){ d[p]^=x; p+=lowbit(p); } } int sum(int p){ int ret = 0; while(p){ ret+=d[p]; p-=lowbit(p); } return ret; } int xor_sum(int p){ int ret = 0; while(p){ ret^=d[p]; p-=lowbit(p); } return ret; } }; struct Node{ int x,y,id; int ret; Node(int x,int y,int id):x(x),y(y),id(id){} Node(){} }; bool cmpY(const Node &a,const Node &b){ return a.y<b.y; } bool cmpID(const Node &a,const Node &b){ return a.id<b.id; } int main(){ ios_base::sync_with_stdio(false); int n; while(scanf(" %d",&n)==1){ vector<int> a(n+1,0); for(int i=1;i<=n;i++){ //cin>>a[i]; scanf(" %d",&a[i]); } int q; //cin>>q; scanf(" %d",&q); vector<Node> pd(q); for(int i=0;i<q;i++){ //cin>>pd[i].x>>pd[i].y; scanf(" %d %d",&pd[i].x,&pd[i].y); pd[i].id=i; } sort(pd.begin(),pd.end(),cmpY); FenWick fw; fw.init(n); map<int,int> kk; for(int i=1,j=0;i<=n&&j<(int)pd.size();i++){ if(kk.count(a[i])){ fw.xor_add(kk[a[i]],a[i]); } kk[a[i]]=i; fw.xor_add(i,a[i]); a[i]^=a[i-1]; //计算出不同数的xor 全部数的xor 异或它就是答案了 // cout<<"XOR:"<<fw.xor_sum(i)<<endl; while(j<(int)pd.size()&&pd[j].y==i){ // cout<<pd[j].x<<","<<pd[j].y<<endl; // cout<<a[i]<<","<<a[pd[j].x-1]<<","<<fw.xor_sum(i)<<","<<fw.xor_sum(pd[j].x-1)<<endl; pd[j].ret = a[i]^a[pd[j].x-1]^fw.xor_sum(i)^fw.xor_sum(pd[j].x-1); //cout<<(12^0^12^0)<<endl; //cout<<(a[i]^a[pd[j].x-1]^fw.xor_sum(i)^fw.xor_sum(pd[j].x-1))<<endl; j++; } } sort(pd.begin(),pd.end(),cmpID); for(int i=0;i<q;i++){ //cout<<pd[i].ret<<endl; printf("%d\n",pd[i].ret); } } return 0; }

    转载请注明原文地址: https://ju.6miu.com/read-1295302.html
    最新回复(0)