1 条题解

  • 8
    @ 2024-10-4 13:02:45

    直说了吧,这是史

    先考虑 Wl,rW_{l,r} 的值,可见,如果某个元素在 ala_l ~ ara_r 中出现了偶数次,那么在异或过程中自己就会抵消,反之,若出现了奇数次,那么在异或后只会剩下一个自己。综上可知:

    Wl,r=i=lraiW_{l,r}=\oplus_{i=l}^r a_i

    那么,我们只需要计算i=lrj=irk=ijak\oplus_{i=l}^r \oplus_{j=i}^r \oplus_{k=i}^j a_k 即可。根据 pp=0p \oplus p =0 可以将上述式子化简:

    可能性一:(rl+1)(r-l+1) 为偶

    此时每一个 j=irk=ijak\oplus_{j=i}^r \oplus_{k=i}^j a_k 都能与 j=ri+1rk=ijak\oplus_{j=r-i+1}^r \oplus_{k=i}^j a_k 抵消,所以答案一定为 00

    可能性二:(rl+1)(r-l+1) 为奇

    此时经过抵消,最后只剩下 alal+2....ar2ara_l \oplus a_{l+2} \oplus ....\oplus a_{r-2} \oplus a_r。但是我们仍然不能 O(n)O(n) 地去计算这个值,于是想到前缀异或和。

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    long long a[200005],xr[200005];
    int main(){
       //freopen("dragon.in","r",stdin);
       //freopen("dragon.out","w",stdout);
       long long n,q,l,r,ans;
       cin>>n>>q;
       for(int i=1;i<=n;i++) cin>>a[i];
       xr[1]=a[1];
       for(int i=2;i<=n;i++) xr[i]=xr[i-2]^a[i];
       cout<<endl;
       for(int i=1;i<=q;i++){
          cin>>l>>r;
          if((r-l+1)%2==0) cout<<0<<endl;
          else{
             ans=xr[r]^xr[max(0ll,l-2)];
             cout<<ans<<endl;
          }
       }
       return 0;
    }
    

信息

ID
780
时间
1000ms
内存
256MiB
难度
7
标签
(无)
递交数
39
已通过
10
上传者