17-09-10四校联考

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 }

 

posted on 2017-09-12 13:13  whz2002  阅读(92)  评论(0编辑  收藏  举报