zoukankan      html  css  js  c++  java
  • 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
    ",ans[i]);
    63     return 0;
    64 }
    View Code

    UPD:少袄夜,戒躁

    戒骄戒躁
  • 相关阅读:
    两个单链表的第一个公共节点
    对于混沌定义中三个条件的理解
    sort()函数使用详解
    C++优先队列详解
    第一次只出现一个的字符
    丑数
    把数组排成最小的数
    从1到n整数中1的个数
    git相关知识
    文件处理(如果文件存在则追加,不存在则生成多级文件夹以及txt目录)
  • 原文地址:https://www.cnblogs.com/lxzl/p/9750688.html
Copyright © 2011-2022 走看看