首页 > 其他分享 >【题解】P3917 异或序列

【题解】P3917 异或序列

时间:2024-10-14 22:37:40浏览次数:9  
标签:cnt limits int 题解 sum 贡献 P3917 异或

传送门

也算是一个有关于异或的小 trick 吧,简单记录一下。

可以维护原序列的前缀异或和 \(sum\),于是原题答案贡献变为 \(\sum\limits_{i=1}^n \sum\limits_{j=i}^n sum_j \oplus sum_{i-1}\)。变形一下为 \(\sum\limits_{i=0}^{n-1} \sum\limits_{j=1}^{i+1} sum_i \oplus sum_{j}\)。发现按照常规的方法做不动了。

于是我们换一种思路,按照二进制位统计贡献。因为异或的特殊性,“相同为1,不同为0”。只有当同一位上的状态不同时(0/1 or 1/0)才能对答案做出贡献。记 \(cnt_{i,0/1}\) 表示在已统计过的所有数中第 \(i\) 位的 \(0/1\) 的个数。

考虑如何统计答案。假设枚举到了第 \(i\) 位,前 \(i-1\) 位的 \(cnt\) 贡献已经计入桶中。则当前位的答案贡献为:

  1. 若当前 \(a_i\) 第 \(j\) 位为 \(0\),则一共能作出 \(2^j\times cnt_{j,1}\) 的贡献。因为当前位的 \(0\) 能和之前所有的 \(1\) 形成 \(2^j\) 的贡献,总共为 \(2^j\times cnt_{j,1}\);

  2. 同理。若当前 \(a_i\) 第 \(j\) 位为 \(1\),则一共能作出 \(2^j\times cnt_{j,0}\) 的贡献。

最后将位置 \(i\) 的 \(cnt\) 贡献加入即可。答案一边枚举一边统计。

时间复杂度从 \(O(n^2)\) 优化至 \(O(n)\)。

#include<bits/stdc++.h>
#define int long long
#define For(i,l,r) for(int i=l;i<=r;++i)
#define FOR(i,r,l) for(int i=r;i>=l;--i)

using namespace std;

const int N = 1e5 + 10;

int n, sum[N], cnt[N][2], ans;

signed main() {
  ios::sync_with_stdio(0);
  cin.tie(0), cout.tie(0);
  cin >> n;
  For(i,0,30) cnt[i][0] = 1;
  For(i,1,n) {
    int x; cin >> x;
    sum[i] = sum[i-1] ^ x;
    FOR(j,30,0) {
      if((sum[i] >> j) & 1) {
        ans += (1 << j) * cnt[j][0];
        cnt[j][1]++;
      } else {
        ans += (1 << j) * cnt[j][1];
        cnt[j][0]++;
      }
    }
  }
  cout << ans << '\n';
  return 0;
}

标签:cnt,limits,int,题解,sum,贡献,P3917,异或
From: https://www.cnblogs.com/Daniel-yao/p/18466262

相关文章

  • [TJOI2019] 甲苯先生的字符串 题解
    T2[TJOI2019]甲苯先生的字符串矩阵乘法优化DP,所以一般来说这种DP都不怎么难。30pts的DP是裸的:设\(f_{i,j}\)为前\(i\)位、最后一位是\(j\)的方案数,则有转移方程:\[f_{i,j}=\sum_{k=0}^{25}f_{i-1,k}\landk\nej\]想要矩阵优化,我们想到构造答案矩阵:\[\mathit{an......
  • [PA2021] Od deski do deski 题解
    T1[PA2021]Oddeskidodeski发现合法的字符串一定是类似\(\texttt{aa...aabb...bbcc...cc}\)的形式,也就是若干个\(\texttta\)、若干个\(\textttb\) 和若干个\(\textttc\) 等组成的形式。如果当前选好的串\(S_1\)是合法的,且有另一个合法的串\(S_2\),那么显然\(S_1......
  • 牛客周赛63部分题解
    比赛地址:牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ(nowcoder.com)A.小红的好数#include<bits/stdc++.h>usingnamespacestd;#definelllonglong#defineullunsignedlonglongvoidsolve(){lln;cin>>n;if(n>=10&&n<=99......
  • [ABC213G] Connectivity 2 题解
    好好好。我们设当前处理\(i\)的答案,那么最后的图就可以分成两个部分:\(1\)所在的联通块和其他,根据乘法原理,答案就是它们二者方案的乘积。设\(f_s\)表示集合\(s\)中所有点联通时图的情况数,\(g_s\)表示集合\(s\)中所有点不一定联通时图的情况数,则有:\[ans_i=\sum\limits......
  • 题解:P11132 【MX-X5-T4】「GFOI Round 1」epitaxy
    ProblemLink【MX-X5-T4】「GFOIRound1」epitaxy题目描述给你两个正整数\(n,m\)。定义一个\(1\simn\)的排列\(p\)的价值为所有的\(n-m+1\)个长度为\(m\)的连续子串内最大值的最大公因数。(规定单个数的最大公因数为其自身。)请你求出一个在所有\(1\simn\)......
  • 题解:P9137 [THUPC 2023 初赛] 速战速决
    ProblemLink[THUPC2023初赛]速战速决题目描述题意清晰,不再过多赘述。Solution每张不同的卡是等效的。小\(J\)手上的卡牌只有\(2\)种情况:手上没有相同的牌和有相同的牌。情况\(1\):小\(J\)手上的牌等价于\(1\simn\)(但其实没用),令其手上的牌为\(b_1,b_2,\ldo......
  • 题解:P6299 差别
    ProblemLink差别题目描述给定\(a,b,c,d\),求\(p,q,r,s\)使得\(M\)成为非零最小值。Solution\(M\)的表达式很复杂,把式子拆开有\(16\)个\(4\)次项,不难发现这是一个平方和,不断套平方和公式,最后化简成:\[M=|(ap+bq+cr-ds)^2+(-aq+bp+cs+dr)^2|=((a+bi)\times(......
  • 题解:P9743 「KDOI-06-J」旅行
    ProblemLink「KDOI-06-J」旅行题意题目讲的很清楚,不再过多赘述。Solution不难想到\(O(n^2\timesm^2\timesk)\)的做法:定义\(f_{i,j,val,x,y}\)为当前在\((x,y)\)的位置,花费\(val\)元,手上有\(x\)张\(L\)公司的票,\(y\)张\(Z\)公司的票的方案数,至于空间问题......
  • 题解:P1709 [USACO5.5] 隐藏口令 Hidden Password
    ProblemLink[USACO5.5]隐藏口令HiddenPassword题目描述求最小表示法的开头字母在原字符串的位置。Solution最小表示法板子,双指针解决即可。Code#include<iostream>#include<algorithm>#include<string.h>#include<cstring>#include<cmath>#include<cstdio>......
  • [PA2021] Od deski do deski 题解
    好题好题,难者不会会者不难,我是前者。实际上加入就可以合法的数是很好计算的。考虑现在所有前缀合法串后的字符实际上都可以满足条件。容易想到根据是否合法设置状态。设\(f_{i,j}/g_{i,j}\)表示现在填第\(i\)个数,有\(j\)个填了就合法的数,现在的串合法/不合法。那么有转......