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.
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).
For each query print the answer in a separate line.
3 1 2 2 4 1 10
1 3 7
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
第1次打div1,就赶上cf挂了,不算rating,在25分钟交了一发,判了半个多小时,最后返回个RE,竟然位运算爆int了,过了A题就睡觉去了
给出一段区间的左端点和右端点,求这段区间的二进制的1最多的最小的。
先把左区间L化为二进制,再把左区间的二进制的从最小位开始,每位变为1,因为这是在当前1的个数中最小的且大于L的。直到大于右区间R。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
long long a[100];
int main()
{
long long l,r;
int n;
scanf("%d",&n);
while(n--)
{
scanf("%I64d%I64d",&l,&r);
memset(a,0,sizeof(a));
int cou=0;
long long ans=l;
while(l>0)
{
a[cou++]=(l%2);
l=l/2;
}
for(int i=0;; i++)
{
a[i]=1;
long long temp=0;
for(int j=0; j<max(cou,i+1); j++)
{
temp+=(a[j]<<j);
}
if(temp<=r)
ans=temp;
else
break;
}
printf("%I64d\n",ans);
}
return 0;
}