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 @   sz_jinzikai  阅读(1)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示