codeforces 484A Bits 贪心->位数

来源:互联网 发布:struct node *link,*p 编辑:程序博客网 时间:2024/06/05 16:17
点击打开链接

A. Bits
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

Let's denote as  the number of bits set ('1' bits) in the binary representation of the non-negative integer x.

You are given multiple queries consisting of pairs of integers l and r. For each query, find the x, such that l ≤ x ≤ r, and is maximum possible. If there are multiple such numbers find the smallest of them.

Input

The first line contains integer n — the number of queries (1 ≤ n ≤ 10000).

Each of the following n lines contain two integers li, ri — the arguments for the corresponding query (0 ≤ li ≤ ri ≤ 1018).

Output

For each query print the answer in a separate line.

Sample test(s)
input
31 22 41 10
output
137
Note

The binary representations of numbers from 1 to 10 are listed below:

110 = 12

210 = 102

310 = 112

410 = 1002

510 = 1012

610 = 1102

710 = 1112

810 = 10002

910 = 10012

1010 = 10102


给你一个区间l,r,让你从此区间中找到二进制数中1的个数最多的那个数,若有多个,取最小。
将l和r转换成二进制数,那么将这两个数从高位往地位开始判断,如果相同,那么答案在这位上也是此值,如果不相等,那么答案在此为上为0,然后剩下的低位都为1。当然特殊情况就是当判断在某位不同时,r的剩下低位全是1,那么在此不同的位上也应该是1。
//841 ms 2300 KB#include<stdio.h>#include<string.h>#include<algorithm>#define ll __int64using namespace std;ll s1[100007],s2[100007],s[100007];int main(){    int n;    scanf("%d",&n);    while(n--)    {        ll l,r;        int num1=0,num2=0;        scanf("%I64d%I64d",&l,&r);        memset(s1,0,sizeof(s1));        memset(s2,0,sizeof(s2));        memset(s,0,sizeof(s));        while(l)        {            s1[num1++]=l%2;            l>>=1;        }        while(r)        {            s2[num2++]=r%2;            r>>=1;        }        ll ans=0;        int flag=0,i;        int num=max(num1,num2);        for(i=num-1; i>=0; i--)        {            if(s2[i]==s1[i])s[i]=s2[i];            else break;        }        for(int k=i; k>=0; k--)        {            s[k]=1;            if(!s2[k])flag=1;        }        if(flag)s[i]=0;        ll aa=1;        for(int k=0; k<num; k++,aa*=2)            ans+=s[k]*aa;        printf("%I64d\n",ans);    }    return 0;}


0 0
原创粉丝点击