题面传送门

题意:求 \(\max\limits_{i<j<k}a_i|(a_j\&a_k)\)。

\(1\leq n \leq 10^6,1\leq a_i\leq 2\times 10^6\)

u1s1 这题算高维前缀和里不那么 sb 的题,虽然代码也很简单。

很容易想到一个贪心,从高到低枚举每一位,能填 \(1\) 就填 \(1\),不能填 \(1\) 就填 \(0\)。

于是本题转化为一个问题:是否存在某个 \(i,j,k\) 使得 \(x\) 为 \(a_i|(a_j\&a_k)\) 的子集。枚举 \(a_i\) 包含 \(x\) 中的哪些位,然后贪心地取下标最小的 \(i\),以及下标最大的 \(j,k\),判断 \(i<j\) 即可。

至于怎样求下标最小的 \(i\) 和下标最大的 \(j,k\)。记 \(mn_x\) 为下标最小的包含 \(x\) 的 \(a_i\),\(mx_x\) 为下标最大的两个包含 \(x\) 的 \(a_i\)。高位前缀和随便一搞就行了。

#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define fz(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
#define ffe(it,v) for(__typeof(v.begin()) it=v.begin();it!=v.end();it++)
#define fill0(a) memset(a,0,sizeof(a))
#define fill1(a) memset(a,-1,sizeof(a))
#define fillbig(a) memset(a,63,sizeof(a))
#define pb push_back
#define ppb pop_back
#define mp make_pair
template<typename T1,typename T2> void chkmin(T1 &x,T2 y){if(x>y) x=y;}
template<typename T1,typename T2> void chkmax(T1 &x,T2 y){if(x<y) x=y;}
typedef pair<int,int> pii;
typedef long long ll;
template<typename T> void read(T &x){
x=0;char c=getchar();T neg=1;
while(!isdigit(c)){if(c=='-') neg=-1;c=getchar();}
while(isdigit(c)) x=x*10+c-'0',c=getchar();
x*=neg;
}
const int MAXN=1e6;
const int LOG_N=21;
const int LIM=(1<<LOG_N)-1;
int n,a[MAXN+5],tmp[4],mn[LIM+5];
pii mx[LIM+5];
pii merge(pii x,pii y){
tmp[0]=x.fi,tmp[1]=x.se,tmp[2]=y.fi,tmp[3]=y.se;
sort(tmp,tmp+4);reverse(tmp,tmp+4);return mp(tmp[0],tmp[1]);
}
bool check(int x){
for(int i=x;i;i=(i-1)&x) if(mn[x^i]<mx[i].se) return 1;
return (mn[x]<mx[0].se);
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
memset(mn,63,sizeof(mn));
for(int i=1;i<=n;i++) mn[a[i]]=min(mn[a[i]],i);
for(int i=1;i<=n;i++) mx[a[i]]=merge(mx[a[i]],mp(i,0));
for(int i=0;i<LOG_N;i++) for(int j=LIM;~j;j--) if(!(j>>i&1)){
mn[j]=min(mn[j],mn[j^(1<<i)]);mx[j]=merge(mx[j],mx[j^(1<<i)]);
}
int cur=0;for(int i=LOG_N;~i;i--) if(check(cur|(1<<i))) cur|=(1<<i);
printf("%d\n",cur);
return 0;
}

上帝不要惩罚我刷水题(

Codeforces 1208F - Bits And Pieces(高维前缀和)的更多相关文章

  1. Codeforces 1208F Bits And Pieces 位运算 + 贪心 + dp

    题意:给你一个序列a, 问a[i] ^ (a[j] & a[k])的最大值,其中i < j < k. 思路:我们考虑对于每个a[i]求出它的最优解.因为是异或运算,所以我们从高位向 ...

  2. Codeforces F. Bits And Pieces(位运算)

    传送门. 位运算的比较基本的题. 考虑枚举\(i\),然后二进制位从大到小考虑, 对于第\(w\)位,如果\(a[i][w]=1\),那么对\(j.k\)并没有什么限制. 如果\(a[i][w]=0\ ...

  3. CF1208F Bits And Pieces

    CF1208F Bits And Pieces 传送门 思路 这里要运用SOS-DP的思路(\(\text{Sum over Subsets}\)).我在另外一篇博客里介绍过,如有需要可以搜索一下我的 ...

  4. Codeforces 449D Jzzhu and Numbers(高维前缀和)

    [题目链接] http://codeforces.com/problemset/problem/449/D [题目大意] 给出一些数字,问其选出一些数字作or为0的方案数有多少 [题解] 题目等价于给 ...

  5. codeforces 938F(dp+高维前缀和)

    题意: 给一个长度为n的字符串,定义$k=\floor{log_2 n}$ 一共k轮操作,第i次操作要删除当前字符串恰好长度为$2^{i-1}$的子串 问最后剩余的字符串字典序最小是多少? 分析: 首 ...

  6. Codeforces 772D - Varying Kibibits(高维差分+二项式定理维护 k 次方和)

    Codeforces 题目传送门 & 洛谷题目传送门 首先很容易注意到一件事,那就是对于所有 \(f(S)\) 可能成为 \(x\) 的集合 \(S\),必定有 \(\forall y\in ...

  7. LOJ2542 PKUWC2018 随机游走 min-max容斥、树上高斯消元、高维前缀和、期望

    传送门 那么除了D1T3,PKUWC2018就更完了(斗地主这种全场0分的题怎么会做啊) 发现我们要求的是所有点中到达时间的最大值的期望,\(n\)又很小,考虑min-max容斥 那么我们要求从\(x ...

  8. Luogu3175 HAOI2015 按位或 min-max容斥、高维前缀和、期望

    传送门 套路题 看到\(n \leq 20\),又看到我们求的是最后出现的位置出现的时间的期望,也就是集合中最大值的期望,考虑min-max容斥. 由\(E(max(S)) = \sum\limits ...

  9. HihoCoder - 1496:寻找最大值(高维前缀和||手动求子集)

    描述 给定N个数A1, A2, A3, ... AN,小Ho想从中找到两个数Ai和Aj(i ≠ j)使得乘积Ai × Aj × (Ai AND Aj)最大.其中AND是按位与操作. 小Ho当然知道怎么 ...

随机推荐

  1. python中对列表的排序

    1.sort()对列表永久性的排序,首字母按照字母表的顺序排列 book=['python','java','c++','web'] book.sort() print(book) 结果如下: 2.向 ...

  2. vue介绍啊

    声明式渲染:vue的核心是一个允许你才用一个简洁的模板语法来声明式的将数据渲染进行DOM的系统 html部分:<div id="app"> {{message}}< ...

  3. ScatterLayout:分散布局在py中的引用

    """ ScatterLayout:分散布局 """ from kivy.app import App from kivy.uix.scat ...

  4. [软工顶级理解组] Beta阶段事后分析

    目录 设想和目标 计划 资源 变更管理 设计/实现 测试/发布 团队的角色,管理,合作 总结 质量提高 会议截图 设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰 ...

  5. [no_code]团队贡献分分配规则

    项目 内容 2020春季计算机学院软件工程(罗杰 任健) 2020春季计算机学院软件工程(罗杰 任健) 作业要求 团队贡献分分配规则 我们在这个课程的目标是 远程协同工作,采用最新技术开发软件 这个作 ...

  6. [Beta]the Agiles Scrum Meeting 5

    会议时间:2020.5.19 20:00 1.每个人的工作 今天已完成的工作 成员 已完成的工作 issue yjy 为评测机增加更多评测指标 评测部分增加更多评测指标 tq 为评测机增加更多评测指标 ...

  7. Verdi Transaction Debug Mode 简单使用

    转载:Verdi Transaction Debug Mode 简单使用_Holden_Liu的博客-CSDN博客 文档与源码: User Guide: Verdi_Transaction_and_P ...

  8. ubuntu 编译C++ error: ‘syscall’ was not declared in this scope

    明明已经加了头文件 #include <sys/syscall.h> #include <sched.h> #include <sys/resource.h> 编译 ...

  9. 转帖:新版vivado2019.2新增增量综合功能

    从 Vivado 2019.1 版本开始,Vivado 综合引擎就已经可以支持增量流程了.这使用户能够在设计变化较小时减少总的综合运行时间. Vivado IDE 和 Tcl 命令批处理模式都可以启用 ...

  10. hdu 4786 Fibonacci Tree (最小、最大生成树)

    题意: N个点,M条边.每条边连接两个点u,v,且有一个权值c,c非零即一. 问能否将N个点形成一个生成树,并且这棵树的边权值和是一个fibonacii数. (fibonacii数=1,2,3,5,8 ...