http://acm.hdu.edu.cn/showproblem.php?pid=5969
题目:在l->r的范围内找x,y。求x|y最大
思路:把l,r分解成二进制,那么我们的目的就是使1尽量的多,这里我们可以枚举l,r的二进制,当他们第一个出现不同的时候,把这个后面的全部置为1即可
因为从这个位置开始的全部为1的二进制的范围一定是在l,r之间的
1 #include <stdio.h> 2 #include <string.h> 3 4 int main() 5 { 6 int t; 7 long long l,r; 8 scanf("%d",&t); 9 long long a[100]; 10 a[0] = 1; 11 for(int i = 1;i<64;i++) 12 a[i] = 2*a[i-1]; 13 bool posa[64]; 14 bool posb[64]; 15 long long ans; 16 while(t--) 17 { 18 scanf("%lld%lld",&l,&r); 19 memset(posa,false,sizeof(posa)); 20 memset(posb,false,sizeof(posb)); 21 ans = 0; 22 for(int i=62;i>=0;i--) 23 { 24 if(a[i]+ans<=r){ 25 ans+=a[i]; 26 posa[i] = true; 27 } 28 } 29 ans = 0; 30 for(int i = 62;i>=0;i--) 31 { 32 if(a[i]+ans<=l){ 33 ans+=a[i]; 34 posb[i] = true; 35 } 36 } 37 ans = 0; 38 for(int i = 62;i>=0;i--) 39 { 40 if(ans) 41 posa[i] = true; 42 else if(posa[i]!=posb[i]) 43 ans++; 44 } 45 ans = 0; 46 for(int i = 62;i>=0;i--) 47 if(posa[i]) 48 ans+=a[i]; 49 printf("%lld ",ans); 50 } 51 return 0; 52 }