感觉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版权协议,转载请附上原文出处链接和本声明。