Home >Web Front-end >HTML Tutorial >A. Bits(Codeforces Round #276(div1)_html/css_WEB-ITnose
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
第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;}