CF1903D1 题解

思路

aia_i 的与结果中第 ii 位是 11,则必须每个 aia_i 的第 ii 位都是 11。然后我们只需要从高位开始枚举 ii,如果次数足够那就操作,否则就不操作。

代码

# 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;
}
posted @ 2024-05-20 16:07  Vitamin_B  阅读(8)  评论(0)    收藏  举报  来源