Sum of XOR Functions CF1879D
原地址:
https://codeforces.com/problemset/problem/1879/D
首先暴力肯定TLE了(n = 3e5,n^2)
考虑nlogn及以下的的方法
我们注意到一点:$\sum_{i=l}^{r} f(l,r) $中间有很多冗余过程, \(f(l,r)\)本身目的就是求区间异或运算后的所有位对答案本身的贡献,\((r - l + 1)\)同时也保证了答案的关系仅且和本身区间这个关键词相连系. 也就是按位处理
首先我们先处理区间段的影响,对1~2^30每一个二进制位分别进行贡献计算
//sum[1]sum[0]统计前缀0/1的全部索引的和
//cnt[0]cnt[1]对应的是不同位上该位为0/1对答案的贡献(所以需要每次都重置)
for(int b = 0;b < 31;b++){
ll mask = 1<<b;
//因为初始为0所以cnt[0] = 1;
cnt[0] = 1,cnt[1] = 0;
for(int i = 0;i<n;++i){
bit ^= ((a[i] & mask) ? 1 : 0);
/*
(i + 1) * cnt[1^bit]实际上就在[1^bit](把当前数统计以后)都以i + 1作为右端点的整体贡献
sum[1 ^ bit]修正所有点到对应正确的区间范围内
*/
res = (res % mod + (i + 1) * cnt[1 ^ bit] - sum[1 ^ bit]) % mod;
//当前点贡献加入
cnt[bit]++;
sum[bit] += (1 + i);
}
ans = (ans % mod + res * mask) % mod;
}
整体的复杂度就是nlog(\(a_m\)) \(a_m\)为最大项的最高位
在这里就不给完整代码了,因为只要掌握了位运算的