题面传送门

题意:求 \(\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. C++ 类继承 笔记(初步)

    本节内容源于对C++ primer第13章的学习,这本书把C++的原理将得明明白白.网上的博客往往讲得一头雾水.到头来还不如看原书本. 问题 首先给出一题: #include<stdio.h&g ...

  2. Java序列初始化

    1.数组 Java数组可以用元素集合初始化: char[] c=new char[]{'.','.','.','.'}; 而想要用指定数量的相同元素来初始化数组,可以使用Arrays.fill()方法 ...

  3. [Beta]the Agiles Scrum Meeting 9

    会议时间:2020.5.24 21:00 1.每个人的工作 今天已完成的工作 成员 已完成的工作 issue yjy 撰写技术博客 tq 实现评测机获取评测状态功能 评测部分增加更多评测指标 wjx ...

  4. flink中使用lambda表达式

    flink中使用lambda表达式 1.使用lambda的一个示例 2.使用上面这种写法通常或得到如下错误 3.解决方案 4.建议 5.完整代码 在 java8中有一种新的语法糖,即 lambda表达 ...

  5. CODING 助力江苏高速信息实现组织敏捷与研发敏捷,领跑智慧交通新基建

    疫情之下的高速公路管控重任 江苏高速公路信息工程有限公司(以下简称:江苏高速信息)成立于 2002 年,是江苏交通控股旗下,专业从事高速公路领域机电系统集成.智能交通软硬件研发.大数据分析运营的高新技 ...

  6. Python matplotlib pylab 画张图

    from pylab import * w1 = 1 w2 = 25 fs = 18 y = np.arange(-2,2,0.001) x = w1*y*log(y)-1.0/w2*exp(-(w2 ...

  7. poj 3417 Network (LCA,路径上有值)

    题意: N个点,构成一棵树.给出这棵树的结构. M条边,(a1,b1)...(am,bm),代表给树的这些点对连上边.这样就形成了有很多环的一个新"树". 现在要求你在原树中断一条 ...

  8. oracle修改CHARACTERSET

    [oracle@vm10-84-32-2 ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Thu Jun 11 1 ...

  9. 第三周PTA笔记 回文数+A-B(大数减法)+高精度除法+数楼梯(大数加法)

    回文数 对于一个自然数n,若将n的各位数字反向排列所得的数n1与n相等,则称n为回文数,例如2332. 若给定一个N( 2<=N<=16)进制数M(M的长度在一百位以内),如果M不是回文数 ...

  10. 暑假算法练习Day4

    已经坚持第四天啦,Fighting!!! 1008 数组元素循环右移问题 (20 分) 一个数组\(A\)中存有\(N\)\((>0)\)个整数,在不允许使用另外数组的前提下,将每个整数循环向右 ...