题意:给定一个区间,在这个区间内找到两个数,使得他们的位或值最大。
思路分析:我们可以从二进制的角度来思考这个问题,我们有了一个区间,那么我们最终答案的二进制的位数也就有了限制,那么我们想要做的就一定是尽可能地把这些二进制位全部变成1。由于我们一共选两个数位或取最大值,区间最大值是一定要选的,因为只有这样我们后续需要填的1才能尽可能小,落在区间内。之后就是将另一个数一位一位的拆开,再分别和答案进行计算,由于有区间的限制,我们在位或一位时先将它和左区间进行位或,看是不是小于右区间,再将该位和答案进行计算。
代码:
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #include<vector> 5 using namespace std; 6 typedef long long ll; 7 const int N=1e6+10; 8 int main(){ 9 int n; 10 scanf("%d",&n); 11 while(n--){ 12 ll a,b; 13 scanf("%lld%lld",&a,&b); 14 ll ans=b;//先取最大值 15 for(int i=0;((1ll<<i)|a)<=b;++i){//判断是否在区间内 16 ans|=(1ll<<i);//将该位位或 17 } 18 printf("%lld ",ans); 19 } 20 return 0; 21 }