http://pipioj.online/problem.php?id=1485
アイデア:中心的なアイデアは、入力をバイナリ表現に変換してから、各ビットの寄与を個別に検討することです。sumisum_iを使用できますs u m私入力データストリームがバイナリiiを表すことを示しますiビット1の合計、次にi番目のデータが読み取られると合計s u m配列は、最初のi-1データの情報を記録し、i番目のデータの各ビットを個別に検討すると、このビットで最初のi-1データが等しいかどうかを簡単に取得できます。 XORの性質に応じて蓄積されます。
#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;
}