> 技术文档 > 【补题】Codeforces Round 735 (Div. 2) C. Mikasa

【补题】Codeforces Round 735 (Div. 2) C. Mikasa

 题意:

 思路:题解 CF1554C【Mikasa】 - 洛谷专栏

本篇题解有个人对于他人题解因为不明确的点,有自己的想法理解,如若看不懂,可以移步原题解

1.首先很容易观察到n>m的时候,一定不存在,因为要有0,一定要有m=n

2.很明显,0~m对应得到的值没有规律,甚至异或出来的值都不一定再0~m内,但是假设我们要获得的值是x,那么n\\bigoplus c=x,c是某个不属于0~m的值,因为异或的性质,可以知道n\\bigoplus x=c
x有一个性质x>=m+1

3.这看起来毫无关联,但是我们构造的是答案x,我们先试图构造n\\bigoplus (m+1),但是在这个过程中,从高位到低位贪心构造,如果发现n\\bigoplus x,在那一刻已经满足了x>=m+1,直接跳出就行了
因此这个贪心构造的正确性来自于直接构造x的时候,因为我们试图在构造n\\bigoplus (m+1),因此在这个过程中判断出来的值一定满足x>=m+1,同时因为贪心,这个构造出来的值一定是最小

 个人的错误点就是做的时候选择了n\\bigoplus m,然后试图特判出mex,构造出来的最小可能就是m所带来的,这个点非常难判

代码:

#include using namespace std;#define int long long#define IOS \\std::ios::sync_with_stdio(0); \\std::cin.tie(0);  \\std::cout.tie(0)const int N = 3e5 + 5;const int INF = 1e18;// const int MOD = 998244353;// const int MOD=1e9+7;// const int MOD=100003;const int maxn=5e5+10;void solve(){ int n,m; std::cin >> n >> m; m++; std::bitset a(n); std::bitset b(m); // std::cout << a << \'\\n\' << b << \'\\n\'; if(m<n){ std::cout << 0 <=0;i--){ if(a[i]==1 && b[i]==0){ break; } else if(a[i]==0 && b[i]==1){ mex+=(1ll<<i); } } std::cout << mex <> t; while(t--){ solve(); }}