abc365_E

abc365 E-Xor Sigma Problem

思路

本题首先可以想到用前缀异或和维护,我们记作bi=a1a2···ai,所求的式子就变成了i=0n2j=i+2nbibj,直接求是O(n2)的,考虑如何快速求出i=0x1bibx

因为这是位运算,所以我们不难想到按位考虑,我们记gi,j为当前考虑范围内第q位为p(0,1)的个数,我们动态维护b1...i总的gq,p,当我们枚举到第bi+1时,如果此时的第j位为1,那么gi,0将是有贡献的,反之同理

代码

来自Andy1262

#include<bits/stdc++.h>
using namespace std;
inline long long read(){
	long long ans=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-') f=-f;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		ans=(ans<<3)+(ans<<1)+c-48;
		c=getchar();
	}
	return ans*f;
} 
void write(long long x){
	if(x<0){
		putchar('-');
		x=-x;
	}
	if(x<10) putchar(x+48);
	else{
		write(x/10);
		putchar(x%10+48);
	}
}
long long n;
long long a[200005],b[200005];
long long g[35][2];
long long ans;
signed main(){
	n=read();
	for(long long i=1;i<=n;i++){
		a[i]=read();
		b[i]=a[i]^b[i-1];
	}
	for(long long i=0;i<=28;i++) g[i][0]++;//将b[0]加进去 
	for(long long i=1;i<=n;i++){
		for(long long j=0;j<=28;j++){
			ans+=g[j][bool((b[i])&(1<<j))^1]*(1<<j);//按位统计答案 
		}
		for(long long j=0;j<=28;j++){
			g[j][bool((b[i])&(1<<j))]++;//按位更新g数组 
		}
	}
	for(long long i=1;i<=n;i++) ans-=a[i];//除去长度为1的区间 
	write(ans);
	return 0;
}

更妙的题解

posted @   MGNisme  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示