http://pipioj.online/problem.php?id=1485
思路:核心思想就是把输入转为二进制表示,然后分别考虑每一位的贡献。我们可以用
s
u
m
i
sum_i
sumi表示输入数据流中二进制表示第
i
i
i位1的总和,那么在读入第i个数据时,此时
s
u
m
sum
sum数组记录的就是前i-1个数据的信息,那么单独考虑第i个数据的每一位,我们可以轻松的得到前i-1个数据中在这一位上和它相等或不等的个数,根据异或性质累加即可。
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
using ll=long long;
ll ans=0;
int n,sum[30];
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int idx=0,mask=1,v;
scanf("%d",&v);
while(idx<30)
{
if(v&mask)
{
ans+=(ll)(i-sum[idx])*mask;
++sum[idx];
}
else
ans+=(ll)sum[idx]*mask;
mask<<=1;
++idx;
}
}
printf("%lld\n",ans);
return 0;
}