Codeforces Global Round 8 D. AND, OR and square sum(位运算)
Posted kanoon
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Global Round 8 D. AND, OR and square sum(位运算)相关的知识,希望对你有一定的参考价值。
题目链接:https://codeforces.com/contest/1368/problem/D
题意
给出一个大小为 $n$ 的数组 $a$,每次可以选两个下标不同的元素,一个赋为二者相与的值,同时一个赋为二者相或的值,计算 $sum_{i=1}^n a_i^2$ 的最大值。
题解
即重新分配二进制下所有位的 $1$,贪心构造即可。
证明
重新分配的正确性
如:
egin{equation} 110 end{equation}
egin{equation} 101 end{equation}
操作后得:
egin{equation} 111 end{equation}
egin{equation} 100 end{equation}
即该操作不影响总的 $1$ 的个数。
贪心构造的正确性
egin{equation}
(a + b) ^2 ge a^2 + b^2
end{equation}
代码
#include <bits/stdc++.h> using ll = long long; using namespace std; int main() { int n; cin >> n; int cnt[20] = {}; for (int i = 0; i < n; i++) { int x; cin >> x; for (int j = 0; x; j++) { cnt[j] += x & 1; x >>= 1; } } int a[n] = {}; for (int i = 0; i < 20; i++) for (int j = 0; j < cnt[i]; j++) a[j] += (1 << i); ll ans = 0; for (int i = 0; i < n; i++) ans += 1LL * a[i] * a[i]; cout << ans << " "; }
以上是关于Codeforces Global Round 8 D. AND, OR and square sum(位运算)的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Global Round 8 A. C+=(贪心)
Codeforces Global Round 8 E. Ski Accidents
Codeforces Global Round 8 E - Ski Accidents 拓扑
Codeforces Global Round 8 D. AND, OR and square sum(位运算)
Codeforces Global Round 8 D - AND, OR and square sum 尽量往大的数字上移动