ABC E 题求调
  • 板块灌水区
  • 楼主Double_Light
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/8/3 21:52
  • 上次更新2024/8/4 00:41:22
查看原帖
ABC E 题求调
761137
Double_Light楼主2024/8/3 21:52

rt,赛时调了 30 min 看不出来哪有问题。

思路是分每一位每个数进行前缀和,然后计算前缀和数组里奇偶性不同的数对的个数。

最后样例 #2 跟正确答案差 11,就很奇妙。

#include<iostream>
#define int long long
using namespace std;
int n,a[100005];
int sum[35][100005],ans,cnt;
int b[100005][35];
int mi[35];
int x,y,cnt1,cnt2;
signed main(){
	cin>>n;
	mi[0]=1;
	for(int i=1;i<=30;i++){
		mi[i]=mi[i-1]*2;
	}
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=1;i<=n;i++){
		int x=a[i],tot=0;
		while(x){
			if(x%2)b[i][tot]+=x%2;
			x/=2;
			tot++;
		}
	}
	for(int i=0;i<=30;i++){
		x=0;y=0;
		for(int j=1;j<=n;j++){
			sum[i][j]=sum[i][j-1]+b[j][i];
			sum[i][j]%=2;
			if(sum[i][j]==1){
				x++;
				ans+=y*mi[i];
			}
			else y++,ans+=x*mi[i];
		}
	}
	/*for(int i=0;i<=3;i++){
		for(int j=1;j<=n;j++){
			cout<<sum[i][j]<<' ';
		}
		cout<<endl;
	}*/
	cout<<ans<<endl;
	return 0;
}
2024/8/3 21:52
加载中...