“|”运算是1|1=1,1|0=0,0|1=0,0|0=0。不用想肯定是位运算,但是比赛时想了好久没想通。后来看题解发现是自己想多了。就是从最高位开始往下遍历,如果一个数是2的n次方,那么与他“|”最大的肯定是2^n-1,如果取不到那么肯定是往上取。就是这个往上取,开始想不通,后来看题解才明白。具体看代码吧。


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


代码:

StatusAccepted
Time15ms
Memory1568kB
Length632
LangG++
Submitted
Shared
#include <iostream>
#include <cstdio>
using namespace std;
#define MAX 70
#define LL long long
LL bits[MAX];
int main()
{
    //初始化位数组
    bits[0]=1;
    for(int i=1;i<MAX;i++)bits[i]=bits[i-1]*2;
    int n;
    while(~scanf("%d", &n)){
        while(n--){
            LL l, r, ans, now;
            scanf("%lld%lld", &l,&r);
            ans=l;
            now=0;
            for(int i=MAX-1;i>=0;i--){
                if((r&bits[i])!=0){
                    now+=bits[i];
                    if(now-1>=l)ans=max(ans,(now|now-1));
                }
            }
            printf("%lld\n", ans);
        }
    }
    return 0;
}