hdu 5969

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\n",ans);
50     }
51     return 0;
52 }

 

posted @ 2017-09-06 21:13  一个_小菜鸟  阅读(196)  评论(0编辑  收藏  举报