「codeforces - 1208F」Bits and Pieces
考虑把原问题写成一个在 \(\left(\log_2 \max v \right) \times n\) 的矩阵里选出三列,我们首先预处理出 \(j \cap q\)。具体,我们需要对于每一个权值 \(v\) 求出一个最大的下标 \(p\)(\(1 \leqslant p \leqslant n\))满足存在极大的 \(q < p\) 且 \(v \cap a_p \cap a_q = v\),即 \(v \subseteq \left(a_p \cap a_q\right)\),这个可以做一个二元组 dp,即设 \(f_v\) 为对于 \(v\) 而言的答案,注意到 \(p\) 和 \(q\) 的实际意义是「满足左右两边存在有一个位置做并操作后是 \(v\) 的超集的位置下标」的最大值和次大值,所以更新答案是容易的。
考虑如何转移。对于一个左闭右开区间 \([0, 2^n)\),我们分治求出 \([0, 2^{n-1})\) 和 \([2^{n-1}, 2^n)\) 的 dp,当然左边区间的 dp 值不会对右边区间产生影响,所以我们考虑右边区间对左边区间的影响。\(\forall i \in [l, m)\),我们需要从 \(i\) 的超集转移到 \(i\),因为在 dp 时我们实际上是把所有贡献放到一个点上,又注意到 \(i-l+m\) 和 \(i\) 的关系就是二进制意义下多了一个最高位的 \(1\),所以只需要从 \(i-l+m\) 转移到 \(i\) 即可(有点谜语,但就这样吧)。
然后就贪心取最高位,挨个取 max 就行了。
int n, a[1000100], qwq;
pii dp[3000100];
pii upd(const pii& x, const pii& y) {
if (x.first > y.first) {
return pii(x.first, max(y.first, x.second));
}
else {
return pii(y.first, max(x.first, y.second));
}
}
void sos_dp(int l, int r) {
if (r-l == 1) {
return;
}
int mid = (l+r)/2;
sos_dp(l, mid), sos_dp(mid, r);
for (int i=l; i<mid; ++i) {
dp[i] = upd(dp[i], dp[i-l+mid]);
}
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for (int i=1; i<=n; ++i) {
cin >> a[i];
dp[a[i]] = upd(dp[a[i]], pii(i, 0));
}
qwq = 1;
for (int up=*max_element(a+1, a+n+1); (1<<qwq) <= up;) {
qwq++;
}
sos_dp(0, 1<<qwq);
int ans = 0;
for (int i=1; i<=n; ++i) {
int offset = 0;
bool f = 0;
for (int j=qwq; j>=0; --j) {
if (~(a[i]>>j)&1 && dp[offset|(1<<j)].second > i) {
offset |= 1<<j, f = 1;
}
}
if (dp[offset].second > i) {
f = 1;
}
if (f) {
cmax(ans, a[i]|offset);
}
}
cout << ans << "\n";
}
「codeforces - 1208F」Bits and Pieces的更多相关文章
- 「Codeforces 79D」Password
Description 有一个 01 序列 \(a_1,a_2,\cdots,a_n\),初始时全为 \(0\). 给定 \(m\) 个长度,分别为 \(l_1\sim l_m\). 每次可以选择一个 ...
- 「Codeforces 468C」Hack it!
Description 定义 \(f(x)\) 表示 \(x\) 的各个数位之和.现在要求 \(\sum_{i=l}^rf(i)\bmod a\). 显然 ans=solve(l,r)%a; if(a ...
- 「Codeforces 724F」Uniformly Branched Trees
题目大意 如果两棵树可以通过重标号后变为完全相同,那么它们就是同构的. 将中间节点定义为度数大于 \(1\) 的节点.计算由 \(n\) 个节点,其中所有的中间节点度数都为 \(d\) 的互不同构的树 ...
- 「CodeForces 581D」Three Logos
BUPT 2017 Summer Training (for 16) #3A 题意 给你三个矩形,需要不重叠不留空地组成一个正方形.不存在输出-1,否则输出边长和这个正方形(A,B,C表示三个不同矩形 ...
- 「CodeForces - 50C 」Happy Farm 5 (几何)
BUPT 2017 summer training (16) #2B 题意 有一些二维直角坐标系上的整数坐标的点,找出严格包含这些点的只能八个方向走出来步数最少的路径,输出最少步数. 题解 这题要求严 ...
- 「CodeForces - 598B」Queries on a String
BUPT 2017 summer training (for 16) #1I 题意 字符串s(1 ≤ |s| ≤ 10 000),有m(1 ≤ m ≤ 300)次操作,每次给l,r,k,代表将r位置插 ...
- 「CodeForces - 717E」Paint it really, really dark gray (dfs)
BUPT 2017 summer training (for 16) #1H 题意 每个节点是黑色or白色,经过一个节点就会改变它的颜色,一开始在1节点.求一条路径使得所有点变成黑色. 题解 dfs时 ...
- 「CodeForces 476A」Dreamoon and Stairs
Dreamoon and Stairs 题意翻译 题面 DM小朋友想要上一个有 \(n\) 级台阶的楼梯.他每一步可以上 \(1\) 或 \(2\) 级台阶.假设他走上这个台阶一共用了 \(x\) 步 ...
- 「CodeForces 546B」Soldier and Badges 解题报告
CF546B Soldier and Badges 题意翻译 给 n 个数,每次操作可以将一个数 +1,要使这 n 个数都不相同, 求最少要加多少? \(1 \le n \le 3000\) 感谢@凉 ...
- 「codeforces - 1284G」Seollal
给定 \(n\times m\) 的网格图,有些格子有障碍,无障碍且相邻的格子之间连边形成图.保证 \((1, 1)\) 无障碍,保证无障碍格子连通. 将网格图黑白染色,相邻格子颜色不同,\((1, ...
随机推荐
- RSA 加密解密
from Crypto.Util.number import bytes_to_long, long_to_bytes, getPrime import libnum # 一.取两个素数 p = ge ...
- opencv图像显示问题
opencv 的图像类型都是numpy array.dtype = uint8. 如果是默认的python的int类型的numpy array,即使每个整数都在范围0-255, 图像也不会显示,必须转 ...
- vue2中v-if 或者 v-show 使用数组中的值判断不生效
知识点来源:博客园==> 外号蓝大胖// 对象this.$set(obj, key, value)/vue.set(obj, key, value)// 数组this.$set(arr, ind ...
- Some book
## book [C++] Accelerated C++ C++ Primer 5th C++ 程序设计语言: 1 ~ 3 C++ 程序设计语言: 4 C++ 编程思想 C++ 标准库 2th C+ ...
- expected unqualified-id on oneapi tbb12
230628-expected unqualified-id eton@230628 在编译supra基于debian12 Qt5.15 tbb12 libtbb12/stable,now 2021. ...
- 计算机网络那些事之 MTU 篇 pt.2
哈喽大家好,我是咸鱼 在<计算机网络那些事之 MTU 篇 >中,咸鱼跟大家介绍了 MTU 是指数据链路层能够传输的最大数据帧的大小 如果发送的数据大于 MTU,则就会进行分片操作(Frag ...
- kibana基本操作
kibana基本应用 一.简介 Kibana是一个开源的分析与可视化平台,设计出来用于和Elasticsearch一起使用的.你可以用kibana搜索.查看存放在Elasticsearch中的数据 ...
- 即构携手智能对讲机品牌Runbo,打造可视化对讲通信系统
现代通信技术的发展,让信息的传递变得前所未有的便捷.作为双向移动通信工具,对讲机不需要网络支持就可以进行通话,且没有话费产生,尤其适合酒店.物业等使用区域固定.通话频繁的场景. 随着技术的不断迭代,对 ...
- 2023ccpc大学生程序设计竞赛-zzh
比赛开始没有开到签到题,看了一会别的题才开始跟榜.A题我写的,不过没有考虑到S长度为1的情况,wa了一次.然后lhy和zx把F题做了出来.接着他俩去看H,我去看B.他俩把H过了,B我想出了一个n*根n ...
- 王道oj/problem23
网址:oj.lgwenda.problem/23 代码: #define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include<stri ...