题意:B君和G君聊天的时候想到了如下的问题。
给定自然数l和r ,选取2个整数x,y满足l <= x <= y <= r ,使得x|y最大。
其中|表示按位或,即C、 C++、 Java中的|运算。
思路:有贪心的思想就是想办法找一个在区间内与r位或后最大
比如:
1000000 r
0111111 用这个数
为了在区间内,我们就可以从L开始对L的每一位从低位开始变1(用1左移与L进行位或)
就算不能全1,这样找到的也是最优因为就算1010 没有0111 那么0100也不会在里面
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
ios_base::sync_with_stdio(false);
int t;
ll l,r;
cin>>t;
while(t--)
{
cin>>l>>r;
ll p=1,cnt=l;
while(cnt<r) cnt=(cnt|p),p<<=1;///把L的每一位换成1,直到到达R,不能取=R,因为=R进来会算一次后会大于R
cout<<(cnt|r)<<endl;
}
return 0;
}