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);
}
上一篇:Rust 迭代器与闭包与高阶函数


下一篇:c++全局函数与成员函数