Codeforces Round #735 (Div. 2) C. Mikasa
C. Mikasa
给定 \(n,m\) 求 序列 \(n \oplus 0, n \oplus 1, n \oplus 2, ... , n \oplus m\) 的 \(MEX\).
思路
题意转化为求最小的整数 \(x\),使得 \(x \oplus n \ge m + 1\),令 \(p = m + 1\) ,贪心的构造 \(x\),由于 \(x \oplus n \ge p\),从高到低枚举第 \(i\) 位,\(n_i\) 表示 \(n\) 的第 \(i\) 位
-
如果 \(n_i = p_i\) 那么要让 \(x \oplus n \ge p\),则 \(x_i = 0\)
-
如果 \(n_i \neq p_i\)
- 如果 \(n_i = 1, p_i = 0\),那么让 \(x_i = 0\) 则此时满足 \(x + n \ge p\),结束即可
- 如果 \(n_i = 0, p_i = 1\),那么让 \(x_i = 1\),让 \(x + n\) 不小于 \(p\)
代码
点击查看代码
#include<bits/stdc++.h>
using namespace std;
int32_t main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int t; cin >> t;
while (t--) {
int n, m; cin >> n >> m;
++m;
int ans = 0;
for (int k = 30; k >= 0 and n < m; k--) {
if ((n >> k & 1) == (m >> k & 1)) continue;
if (m >> k & 1) ans |= 1 << k, n |= 1 << k;
}
cout << ans << '\n';
}
return 0;
}