NC20860 兔子的区间密码

Posted cq.tiancx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NC20860 兔子的区间密码相关的知识,希望对你有一定的参考价值。

题目: NC20860兔子的区间密码 ,哈哈,我们今天来看一道稍微复杂一点的题嘛,这是选自codeforce上的一道题,好了,我们一起来看看题意吧:

题目描述是复制的,可能有部分显示不对,我就把题目链接放下面!
题目链接: NC20860兔子的区间密码

题目描述

有一只可爱的兔子被困在了密室了,密室里有两个数字,还有一行字: 只有解开密码,才能够出去。 可爱的兔子摸索了好久,发现密室里的两个数字是表示的是一个区间[L,R] 而密码是这个区间中任意选择两个(可以相同的)整数后异或的最大值。 比如给了区间[2,5] 那么就有2 3 4 5这些数,其中 2 xor 5=7最大 所以密码就是7。 兔子立马解开了密室的门,发现门外还是一个门,而且数字越来越大,兔子没有办法了,所以来求助你。 提示:异或指在二进制下一位位比较,相同则 0 不同则 1

输入描述

第一行一个数 T,表示数据组数。
接下来 T 行,每行两个数 L,R, 表示区间[L,R]。

输出描述

输出共T行每行一个整数,表示[L,R]的密码。
示例1

输入

5
1 10
2 3
3 4
5 5
2 5

输出

15
1
7
0
7

备注:

思路:

根据题意,我们可以想到,若结果要最大,那么就需要两个数的二进制形式0与1互相对应的情况越多,我们只需要考虑l,r这两个数,直接从高位开始看,若不一样,则从当前开始,后面的全为1,最终得出答案,还有什么不理解的地方就看代码吧,有注释的!

我们来看看成功AC的代码吧:

#include<bits/stdc++.h>
using namespace std;
int n;
typedef long long ll;

int main()
    ios::sync_with_stdio(false);
    cin>>n;
    while(n--)
        ll l,r; cin>>l>>r;
        ll t=l^r;//这里直接把二进制前面相同的去掉了,我们只需要把t的二进制全部改为1,就是答案
        ll ans=0;
        while(t)
            ans=ans*2+1;
            t>>=1;
        
        cout<<ans<<"\\n";
    
    return 0;


谢谢你的阅读,由于作者水平有限,难免有不足之处,若读者发现问题,还请批评,在留言区留言或者私信告知,我一定会尽快修改的。若各位大佬有什么好的解法,或者有意义的解法都可以在评论区展示额,万分谢谢。
写作不易,望各位老板点点赞,加个关注!

以上是关于NC20860 兔子的区间密码的主要内容,如果未能解决你的问题,请参考以下文章

兔子与兔子(hash模板题)

NC15553数学考试

NC15553数学考试

NC 15553. 数学考试

小凸玩密室题解

密室逃脱23迷失俱乐部为啥取不下来机械装置的纸