2020-09-23 刷题记录

Anu Has a Function

思路:

\(f(x, y) = x | y - y\)。将 \(x, y\) 对齐。那么结果就是:如果 \(y\) 的第 \(i\) 是 \(1\),那么把 \(x\) 的第 \(i\) 位变为 \(0\)(无论之前是什么)。那么根据这个性质可以发现,改变的都是第 \(1\) 个数,后面其他数的顺序无影响。那么我们先预处理出每个位置上 \(1\) 的个数,然后枚举第一个数即可。

代码:

int n; cin >> n;
vector<int> a(n + 1), cnt1(32);
int idx, val = -1;
for(int i = 1; i <= n; i ++) cin >> a[i];
for(int i = 1; i <= n; i ++){
    for(int j = 0; j < 32; j ++) if((a[i] >> j) & 1) cnt1[j] ++;
}

for(int i = 1; i <= n; i ++){
    int tmp = 0;
    for(int j = 0; j < 32; j ++)
        if(((a[i] >> j) & 1) && cnt1[j] == 1)
            tmp += (1 << j);
    if(tmp > val){
        val = tmp;
        idx = i;
    }
}
cout << a[idx] << " ";
for(int i = 1; i <= n; i ++) if(i != idx) cout << a[i] << " ";
puts("");
上一篇:《Codeforces Round #732 (Div. 1)》


下一篇:4:倍数问题-4