Codeforces Round #735 (Div. 2) C. Mikasa

C. Mikasa

题目Link

给定 \(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;
}
posted @ 2022-09-14 14:16  ccz9729  阅读(16)  评论(0编辑  收藏  举报