样例过不了求助
查看原帖
样例过不了求助
754006
mobaiawa楼主2024/8/12 11:05
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=5e5+10;
ll read(){
	ll res=0;int op=1;char ch=getchar();
	while(ch<'0'||'9'<ch){if(ch=='-')op=-op;ch=getchar();}
	while('0'<=ch&&ch<='9'){res=res*10+ch-'0';ch=getchar();}
	return res*op;
}
void write(ll x){
	if(x<0){putchar('-');x=-x;}
	if(x>9)write(x/10);
	putchar(x%10+'0');
}
int sum[32][32],hig[N];//sum[i][j]:二进制下位数为i位且第j位为一的数的数量,hig[i]:第i个数二进制下的位数 
int main(){
	int T=read();
	while(T--){
		memset(sum,0,sizeof sum);
		int n=read();
		ll ans=0,tot=0;
		for(int i=1;i<=n;i++){
			ll x=read();
			if(x==0){//特判 
				ans+=n;
				tot++;
				continue;
			}
			vector<int>cnt;
			while(x){//拆位 
				cnt.push_back(x%2);
				x/=2;
			}
			for(int j=0;j<cnt.size();j++)sum[cnt.size()][j+1]+=cnt[j];
			hig[i]=cnt.size();
		}
		for(int i=1;i<=31;i++){//改成前缀和 
			for(int j=1;j<=i;j++){
				sum[i][j]+=sum[i-1][j];
			}
		}
		for(int i=1;i<=n-tot;i++){
			ans+=sum[31][hig[i]]-sum[hig[i]][hig[i]];
		}
//		putchar(':');
		write(ans);
		putchar('\n');
	}
	return 0;
}

输入:

4
3 0 1 3
5
0 1 2 3 4
1
6
1
0
6
1 1 4 5 1 4
10
10 32 43 28 19 83 10 10 83 23
15
132 256 852 31 1 0 12 13 12 0 0 255 143 23 32

输出:

6
6
0
1
3
12
66

正确答案:

6
6
0
1
3
12
65
2024/8/12 11:05
加载中...