【bitmask】和谐度

感觉bitmask的宗旨就是按位考虑啊

比如这道题就是按位计算贡献

其他题也可以按位贪心,按位考虑DP等等....

感觉很帅

题意:

 

思路:

按位计算贡献

因为该数列是无序数列,因此可以哈希地统计每一位的1的个数,然后按位计算贡献

对于每一位,都有很多的1和很多的0

怎么计算这些1和0之间的贡献呢?

首先

对于与运算,一定是1和1之间才有贡献

设x为该位1的个数

贡献就是C(x,2)

对于或运算,一定是1和1,1和0之间才有贡献

贡献就是C(x,2)+x*(n-x)

对于异或运算,一定是1和0之间才有贡献

贡献就是x*(n-x)

最后乘上(1<<j)就是答案

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mxn=1e5+10;
int n,x;
int a[mxn],cnt[33];
void solve(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>x;
        for(int j=30;j>=0;j--){
            if((x>>j)&1) cnt[j]++;
        }
    }
    int ans=0;
    for(int j=30;j>=0;j--){
        ans+=(cnt[j]*(cnt[j]-1)+2*cnt[j]*(n-cnt[j]))*(1<<j);
    }
    cout<<ans<<'\n';
}
signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int __=1;//cin>>__;
    while(__--)solve();return 0;
}


版权声明:本文为weixin_62528401原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。