首页 > 其他 > 详细

Codeforces Round #672 (Div. 2 B. Rock and Lever (位运算)

时间:2020-09-25 19:08:29      阅读:53      评论:0      收藏:0      [点我收藏+]

技术分享图片

  • 题意:给你一组数,求有多少对\((i,j)\),使得\(a_{i}\)&\(a_{j}\ge a_{i}\ xor\ a_{j}\).

  • 题解:对于任意两个数的二进制来说,他们的最高位要么相同要么不相同,如果相同,那么肯定是满足题目条件的,因为异或是不进位的加法,所以我们只要找到所有最高位相同的数的个数,用桶存下来,然后再对他们求个和就行了.

  • 代码:

    int t;
    int n;
    ll x;
    map<ll,ll> mp;
    
    int main() {
        ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
        cin>>t;
        while(t--){
        	cin>>n;
        	mp.clear();
        	for(int i=1;i<=n;++i){
        		cin>>x;
        		ll cnt=0;
        		while(x){
        			cnt++;
        			x>>=1;
        		}
        		mp[cnt]++;
        	}
        	ll res=0;
        	for(auto w:mp){
        		res+=w.se-1+(w.se-1)*(w.se-2)/2;
        	}
        	cout<<res<<endl;
        }
    
        return 0;
    }
    

Codeforces Round #672 (Div. 2 B. Rock and Lever (位运算)

原文:https://www.cnblogs.com/lr599909928/p/13730967.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!