返回顶部

Codeforces Global Round 8 D. AND, OR and square sum (贪心,位运算)

  • 题意:有\(n\)个数,选择某一对数使二者分别\(or\)\(and\)得到两个新值,求操作后所有数平方和的最大值.

  • 题解:不难发现每次操作后,两个数的二进制表示下的\(1\)的个数总是不变的,所以要让平方最大,那么只能使大的尽可能大,那我们就统计每个数二进制下的每一位上\(1\)的个数,然后每个数的位置都尽可能的分配\(1\)就行了.

  • 代码:

    ll n,x;
    ll cnt[N];
    ll ans;
     
    int main() {
        ios::sync_with_stdio(false);cin.tie(0);
        cin >> n;
    	for(int i = 1; i <= n; i++) {
    		cin >> x;
    		for(int j = 0; j < 20; j++) {
    			if((x>>j)&(ll)1){
                    cnt[j]++;
                }
    		}
    	}
    	for(int i = 1; i <= n; i++) {
    		ll cur = 0;
    		for(int j = 0; j < 20; j++) {
    			if(cnt[j]) {
    				cnt[j]--;
    				cur += 1ll << j;
    			}
    		}
    		ans += cur * cur;
    	}
    	cout << ans << endl;
     
        return 0;
    }
    
posted @ 2020-07-01 01:06  _Kolibri  阅读(145)  评论(0)    收藏  举报