cf1368D AND, OR and square sum - 位运算 + 贪心


首先可以知道对于和,与操作,他不会改变两个数字的二进制中1的总个数
比如

第一位 1 0 0
第二位 1 1 0
和操作 1 0 0
与操作 1 1 0

可以发现不会改变1的总个数,那么就进行贪心操作,把1进行分配即可

int a[N], b[30];
void solve(int kase){
    int n; scanf("%d", &n);
    for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
    for(int i = 1; i <= n; i++) {
        for(int j = 0; j <= 20; j++) {
            b[j] += a[i] & 1;
            a[i] >>= 1;
        }
    }
    ll ans = 0;
    for(int i = 1; i <= n; i++) {
        ll now = 0;
        for(int j = 0; j <= 20; j++) {
            if(b[j]) {
                now += 1 << j;
                b[j]--;
            }
        }
        ans += now * now;
    }
    printf("%lld\n", ans);
}
posted @ 2020-12-25 13:55  Emcikem  阅读(81)  评论(0编辑  收藏  举报