codeforces 484A Bits 贪心-)位数

2015-01-27 09:57:12 · 作者: · 浏览: 9
点击打开链接
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).<??http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+CkVhY2ggb2YgdGhlIGZvbGxvd2luZyA8ZW0+bjwvZW0+IGxpbmVzIGNvbnRhaW4gdHdvIGludGVnZXJzIDxlbT5sPC9lbT48ZW0+aTwvZW0+LD88ZW0+cjwvZW0+PGVtPmk8L2VtPiChqgogdGhlIGFyZ3VtZW50cyBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgcXVlcnkgKDA/odw/PGVtPmw8L2VtPjxlbT5pPC9lbT4/odw/PGVtPnI8L2VtPjxlbT5pPC9lbT4/odw/MTAxOCkuPC9wPgoKCgpPdXRwdXQKPHA+CkZvciBlYWNoIHF1ZXJ5IHByaW50IHRoZSBhbnN3ZXIgaW4gYSBzZXBhcmF0ZSBsaW5lLjwvcD4KCgoKU2FtcGxlIHRlc3QocykKCgoKaW5wdXQKPHByZSBjbGFzcz0="brush:java;">3 1 2 2 4 1 10 output

1
3
7
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
  
   
#include
   
     #include
    
      #define ll __int64 using 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