随笔 - 46  文章 - 0  评论 - 1  阅读 - 6250

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   whz2002  阅读(95)  评论(0)    收藏  举报
编辑推荐:
· 一个 java 空指针异常的解决过程
· 揭开 SQL Server 和 PostgreSQL 填充因子的神秘面纱
· 没有调度器的协程不是好协程,零基础深入浅出 C++20 协程
· 别做抢活的导演:代码中的抽象层次原则
· 从 Redis 客户端超时到 .NET 线程池挑战
阅读排行:
· dotnetty 内存泄漏的BUG修复了
· 20250709 - GMX V1 攻击事件: 重入漏洞导致的总体仓位价值操纵
· 面试官:如何实现大模型连续对话?
· TinyEditor v4.0 alpha 版本发布:表格更强大,表情更丰富,上传体验超乎想象!
· 一个java空指针异常的解决过程
< 2025年7月 >
29 30 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 1 2
3 4 5 6 7 8 9

点击右上角即可分享
微信分享提示