PIPIOJ 1485:PIPIのビット演算の問題Ⅳビット演算

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;
}

おすすめ

転載: blog.csdn.net/xiji333/article/details/114582651