首页 > 其他 > 详细

17-09-10四校联考

时间:2017-09-12 14:25:39      阅读:216      评论:0      收藏:0      [点我收藏+]

T1:从高到低依次确定答案的每一位,如果每个区间的第i位都可以选1,那么全部选1,答案的这一位就是1。

如果该区间这一位能够选择0或1,那么将区间缩小为2i至ri

如果不是所有区间都能选1,答案的这一位是0。

如果该区间这一位能够选择0或1,则该区间选0,并将所有比这一位低的位的值全部赋为1。时间复杂度O(n log 1018)。

Code:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define ll long long
 5 #define Lg 60
 6 #define MN 100005
 7 using namespace std;
 8 inline ll in(){
 9     ll x=0;bool f=0; char c;
10     for (;(c=getchar())<0||c>9;f=c==-);
11     for (x=c-0;(c=getchar())>=0&&c<=9;x=(x<<3)+(x<<1)+c-0);
12     return f?-x:x;
13 }
14 ll l[MN],r[MN],n,ans;
15 int main()
16 {
17     n=in();for (int i=1;i<=n;++i) l[i]=in(),r[i]=in();
18     for (int i=Lg;i>=0;--i){
19         bool f=0;for (int j=1;j<=n;++j)
20         if (!(r[j]&(1ll<<i))) {f=1;break;}
21         if (!f){
22             ans+=(1ll<<i);for (int j=1;j<=n;++j)
23             if (!(l[j]&(1ll<<i))) l[j]=0;
24         }else for (int j=1;j<=n;++j)
25         if ((l[j]&(1ll<<i))!=(r[j]&(1ll<<i))) r[j]=(1ll<<Lg)-1;
26     }printf("%lld",ans);return 0;
27 }

 

17-09-10四校联考

原文:http://www.cnblogs.com/codingutopia/p/union170910.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!