码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-06-19 10:37:59      阅读:66      评论:0      收藏:0      [点我收藏+]

标签:force   c++   ORC   mes   space   题意   http   证明   color   

题目链接:https://codeforces.com/contest/1368/problem/D

题意

给出一个大小为 $n$ 的数组 $a$,每次可以选两个下标不同的元素,一个赋为二者相与的值,同时一个赋为二者相或的值,计算 $\sum_{i=1}^n a_i^2$ 的最大值。

题解

即重新分配二进制下所有位的 $1$,贪心构造即可。

证明

重新分配的正确性

如:

\begin{equation} 110 \end{equation}

\begin{equation} 101 \end{equation}

操作后得:

\begin{equation} 111 \end{equation}

\begin{equation} 100 \end{equation}

即该操作不影响总的 $1$ 的个数。

贪心构造的正确性

\begin{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 << "\n";
}

 

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

标签:force   c++   ORC   mes   space   题意   http   证明   color   

原文地址:https://www.cnblogs.com/Kanoon/p/13161547.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!