Codeforces Round 966 (Div. 3) 记录
__vector__ · · 个人记录
本场失误
赛时只过了 A-F,G 题题目太长直接跳过,H 题写完了正解,忘了判断长度为
赛后做 G 猜了个结论看着没错,写了个二分直接过了,H 判了下长度为
丢了 G,H perf 还能苟到 2000+ 是我没想到的,小号
A
注意到满足以下几个条件才是重要数字:
-
长度一定大于等于
3 。 -
前两个数字分别是
1,0 。 -
第三个数字大于等于
2 ,或者第三个数字等于1 且总长度大于等于4 。
B
模拟就可以了。
C
本质上
那么,现在使用一个算法,对每个位置上的数,编号其所属的类。
考虑从前到后扫描,设当前有
明显,如果
D
本题最大的坑点在于一个数可以选多次,我赛时是看到公告才注意到这一点。
容易发现,第一个 L 之前和最后一个 R 之后的数字都不能被选择。
从这里入手,容易证明第一个 L 应当与最后一个 R 匹配。
然后,设其位置分别是
E
由于
然后贪心选择。
F
考虑到各个矩阵互不影响,且事实上只关心每个矩阵贡献为
考虑对每个矩阵预处理贡献对应的代价。
-
dp_{i,j} \leftarrow dp_{i,j-1}+\max\{0,a-i\}
对于
现在要求总贡献
G
容易发现答案具有单调性,并且容易证明对于任意一个点,都应该尽可能早到达(换句话说,不存在一种情况,使得晚到达一个节点反而会使最终到达时间提前)
二分,跑 dijkstra 就可以了。
我的理解是,假设一个节点在
H
注意到长度为
由于本题中
每次操作,相当于删除一个或两个段,加入一个或两个段。
每次查询,相当于在长度为
整理一下,发现需要支持的操作是这些:
- 给定
1 \le x,y \le 2\cdot 10^6, 在第x 个位置插入一个数字y 。 - 给定
1 \le x,y \le 2\cdot 10^6 ,在第x 个位置删除一个数字y 。 - 给定
l ,查询l 开头的后缀的所有集合的最小值。如果没有数字就输出 2000001。
开个