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; }
𝓐𝓬𝓱𝓲𝓮𝓿𝓮𝓶𝓮𝓷𝓽 𝓹𝓻𝓸𝓿𝓲𝓭𝓮𝓼 𝓽𝓱𝓮 𝓸𝓷𝓵𝔂 𝓻𝓮𝓪𝓵
𝓹𝓵𝓮𝓪𝓼𝓾𝓻𝓮 𝓲𝓷 𝓵𝓲𝓯𝓮

浙公网安备 33010602011771号