abc365 E

打印 上一主题 下一主题

主题 687|帖子 687|积分 2061

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
abc365 E-Xor Sigma Problem

思路

本题首先可以想到用前缀异或和维护,我们记作                                             b                            i                                  =                                   a                            1                                  ⊕                                   a                            2                                  ⊕                         ⋅                         ⋅                         ⋅                         ⊕                                   a                            i                                       b_i=a_1\oplus a_2 \oplus ··· \oplus a_i                  bi​=a1​⊕a2​⊕⋅⋅⋅⊕ai​,所求的式子就酿成了                                             ∑                                       i                               =                               0                                                 n                               −                               2                                                      ∑                                       j                               =                               i                               +                               2                                      n                                            b                            i                                  ⊕                                   b                            j                                       \sum^{n-2}_{i=0}\sum^n_{j=i+2}b_i\oplus b_j                  ∑i=0n−2​∑j=i+2n​bi​⊕bj​,直接求是                                   O                         (                                   n                            2                                  )                              O(n^2)                  O(n2)的,考虑怎样快速求出                                             ∑                                       i                               =                               0                                                 x                               −                               1                                                      b                            i                                  ⊕                                   b                            x                                       \sum^{x-1}_{i=0}b_i\oplus b_x                  ∑i=0x−1​bi​⊕bx​
因为这是位运算,以是我们不难想到按位考虑,我们记                                             g                                       i                               ,                               j                                                 g_{i,j}                  gi,j​为当前考虑范围内第                                   q                              q                  q位为                                   p                         (                         0                         ,                         1                         )                              p(0,1)                  p(0,1)的个数,我们动态维护                                   b                         1...                         i                              b1...i                  b1...i总的                                             g                                       q                               ,                               p                                                 g_{q,p}                  gq,p​,当我们枚举到第                                             b                                       i                               +                               1                                                 b_{i+1}                  bi+1​时,如果此时的第                                   j                              j                  j位为                                   1                              1                  1,那么                                             g                                       i                               ,                               0                                                 g_{i,0}                  gi,0​将是有贡献的,反之同理
代码

来自Andy1262
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. inline long long read(){
  4.         long long ans=0,f=1;
  5.         char c=getchar();
  6.         while(c<'0'||c>'9'){
  7.                 if(c=='-') f=-f;
  8.                 c=getchar();
  9.         }
  10.         while(c>='0'&&c<='9'){
  11.                 ans=(ans<<3)+(ans<<1)+c-48;
  12.                 c=getchar();
  13.         }
  14.         return ans*f;
  15. }
  16. void write(long long x){
  17.         if(x<0){
  18.                 putchar('-');
  19.                 x=-x;
  20.         }
  21.         if(x<10) putchar(x+48);
  22.         else{
  23.                 write(x/10);
  24.                 putchar(x%10+48);
  25.         }
  26. }
  27. long long n;
  28. long long a[200005],b[200005];
  29. long long g[35][2];
  30. long long ans;
  31. signed main(){
  32.         n=read();
  33.         for(long long i=1;i<=n;i++){
  34.                 a[i]=read();
  35.                 b[i]=a[i]^b[i-1];
  36.         }
  37.         for(long long i=0;i<=28;i++) g[i][0]++;//将b[0]加进去
  38.         for(long long i=1;i<=n;i++){
  39.                 for(long long j=0;j<=28;j++){
  40.                         ans+=g[j][bool((b[i])&(1<<j))^1]*(1<<j);//按位统计答案
  41.                 }
  42.                 for(long long j=0;j<=28;j++){
  43.                         g[j][bool((b[i])&(1<<j))]++;//按位更新g数组
  44.                 }
  45.         }
  46.         for(long long i=1;i<=n;i++) ans-=a[i];//除去长度为1的区间
  47.         write(ans);
  48.         return 0;
  49. }
复制代码
更妙的题解

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

星球的眼睛

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表