码迷,mamicode.com
首页 > 其他好文 > 详细

17-09-10四校联考

时间:2017-09-12 15:49:16      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:getch   algorithm   std   inline   char   依次   --   时间复杂度   long   

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四校联考

标签:getch   algorithm   std   inline   char   依次   --   时间复杂度   long   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!