题目: 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; }