CodeForces 276 D.Little Girl and Maximum XOR(位运算)

来源:互联网 发布:mmd 动作数据 r-18 编辑:程序博客网 时间:2024/06/07 06:25

Description
从区间[L,R]中找两个数x,y使得x^y值最大
Input
两个整数L和R(1<=L<=R<=1e18)
Output
输出x^y的最大值
Sample Input
1 2
Sample Output
3
Solution
考虑L和R的二进制表示,前面相同的位跳过,因为x和y无论怎么取这些位都是固定的,那么对x^y就没有贡献,从L和R的第一个不同位开始,如果R是1则令y对应位是1,x对应位是0,如果R是0则令y对应位是0,x对应位是1(一定可以取到的原因是L<=R,即使x这位取1也一定在[L,R]中,因为最高一个不同位R是1而L是0),那么这样一直取下去可以使得x和y的每一位都不同,那么异或的结果就是每一位都是1,故直接看L^R的最高位数x即可,答案就是2^x-1
Code

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#include<queue>#include<map>#include<set>#include<ctime>using namespace std;typedef long long ll;#define INF 0x3f3f3f3f#define maxn 1111int main(){    ll l,r;    while(~scanf("%I64d%I64d",&l,&r))    {        ll ans=0;        l^=r;        while(l)        {            ans=ans*2ll+1;            l>>=1;        }           printf("%I64d\n",ans);    }    return 0;}
0 0