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\)为最大项的最高位
在这里就不给完整代码了,因为只要掌握了位运算的

posted @ 2025-05-19 21:17  Lappybreeze  阅读(11)  评论(0)    收藏  举报