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

题意:

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

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

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

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

x有一个性质x>=m+1

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

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

代码:

cpp 复制代码
#include <bits/stdc++.h>
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<100> a(n);
    std::bitset<100> b(m);

    // std::cout << a << '\n' << b << '\n';

    if(m<n){
        std::cout << 0 << '\n';
        return ;
    }

    int mex=0;
    int yes=1;
    for(int i=70;i>=0;i--){
        if(a[i]==1 && b[i]==0){
            break;
        }
        else if(a[i]==0 && b[i]==1){
            mex+=(1ll<<i);
        }
    }

    std::cout << mex << '\n';

}  

signed main(){
    IOS;

    int t=1;
    std::cin >> t;
    while(t--){
        solve();
    }
}
相关推荐
启观川2 小时前
数据结构与算法 -第 3 章 常用算法-回溯算法
数据结构·笔记·python·算法
零基础1232 小时前
LLM4AD:面向算法设计的大语言模型智能体框架
人工智能·算法·语言模型
启观川10 小时前
数据结构与算法 -第 3 章 常用算法-动态规划
数据结构·笔记·python·算法
码爸10 小时前
排序算法介绍
python·算法·排序算法
动词ing12 小时前
【题目练习】算法 组合总和||
算法
longlongzihan12 小时前
链表找环:Floyd 判圈算法(LeetCode 141 & 142 )
c++·算法·leetcode·链表
专业程序开发源12 小时前
flask家电故障预测系统92491-计算机课程设计/毕业设计
vscode·python·sql·算法·flask·课程设计
Logic10112 小时前
C语言/数据结构欧几里得算法题解:长方形切割最大正方形——贪心划分计数
c语言·数据结构·算法·贪心算法·时间复杂度·空间复杂度·欧几里得算法
yi01112 小时前
LeetCode 643. 子数组最大平均数 I|从暴力枚举到滑动窗口
人工智能·笔记·python·算法·leetcode·滑动窗口
极光通讯13 小时前
服务器内存来料检验(IQC)实操:批次追溯、外观判定与上机验证
java·服务器·算法