CF1903D1 题解
思路
若 的与结果中第 位是 ,则必须每个 的第 位都是 。然后我们只需要从高位开始枚举 ,如果次数足够那就操作,否则就不操作。
代码
# include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair <int, int> pii;
int n, q;
ll k, a[100005], b[100005], c[100005], s, ans;
int main () {
ios::sync_with_stdio (0);
cin.tie (0);
cout.tie (0);
cin >> n >> q;
for (int i = 0; i < n; ++ i)
cin >> a[i];
while (q --) {
cin >> k;
for (int i = 0; i < n; ++ i)
b[i] = a[i];
for (int i = 60; ~i; -- i) {
s = 0;
for (int j = 0; j < n; ++ j)
if (b[j] >> i & 1)
c[j] = b[j];
else {
c[j] = (b[j] >> i) + 1 << i;
s += c[j] - b[j];
if (s > k)
goto end;
}
k -= s;
for (int j = 0; j < n; ++ j)
b[j] = c[j];
end:
;
}
ans = b[0];
for (int j = 1; j < n; ++ j)
ans &= b[j];
cout << ans << '\n';
}
return 0;
}

浙公网安备 33010602011771号