hdu5969最大的位或

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5969

题意:给定自然数l和r ,选取2个整数x,y,满足l <= x <= y <= r,使得x|y最大。

分析:先把l和r转换成二进制位,举个栗子:

(假设LR最高位不是同一位):

x、y可以取二进制的11111(一定在L和R范围内的一个数)和100101(R),所以结果是11111或上100101即111111(63)

(如果LR最高位相同):

那就L和R都减去8,转换成L=01,R=001来看,此时x可以取11,y可以取001,所以x|y=111,再加上之前的8,答案是1111(15)

两种并在一起考虑:找出L、R找前面最大的相同位数,不同的地方开始,全部补1。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        long long a,b,res=0;
        scanf("%lld%lld",&a,&b);
        for(int i=63;i>=0;i--)
        {
            if(((1LL<<i)&a)==((1LL<<i)&b))continue;
            else
            {
                for(int j=i;j>=0;j--)
                {
                    res|=(1LL<<j); 
                }
                res|=a;
                break;
            }
        }
        res|=a;
        printf("%lld\n",res);
    }
    return 0; 
} 
View Code
posted @ 2019-10-12 16:09  myrtle  阅读(186)  评论(0编辑  收藏  举报