这是本文档旧的修订版!
题目 | A1 | A2 | B | C | D | E |
---|---|---|---|---|---|---|
通过 | √ | √ | √ | |||
补题 |
std::vector/map/set/deque::swap
可以常数交换两个容器(避免启发式合并时换来换去)。
std::list::splice
可以常数合并两个 list。不能用 std::list::merge
,这是类似链表归并的东西,要重载小于号。
pb_ds 中的可并堆:
#include <ext/pb_ds/priority_queue.hpp> using namespace __gnu_pbds; __gnu_pbds::priority_queue<int, less<int>, pairing_heap_tag> q; // 大根堆
常用 pairing_heap_tag 和 binomial_heap_tag,但由于 pairing_heap_tag 的合并是 $O(1)$ 而后者是 $O(\log n)$ 的,实测是前者快一点。
这两个东西的其他操作都是 $O(\log n)$ 的。
对有一定偏序关系的集合,可以按偏序关系分成小于、等于、大于三类标记,或者是以此为时间线进行修改。
例如,按边权从小到大加边是最常见的一种做法,或者能证明这样的修改量是有限的。另一种例子是,从小到大枚举元素,每次只会让有限个大于标记的元素变为小于,也是一种单调的变化(进而可以用线段树之类的维护)。
题意:一个圆被分为 $10^6$ 份并标号,给 $n \leq 3000$ 段圆上的弧,每段弧都对应了一段连续的标号。尽可能多地选出弧,使得任意选中的两条弧都有至少一个标号相同。
题解:一个比较详细的题解 见此
推荐理由:本题妙的地方在于,它将相交的判定,变成了两个相关量的判定,进而转化为平面上的几何问题,并发现这个问题可以用 DP 解决。
题目 | A | B | C | D | E | F |
---|---|---|---|---|---|---|
通过 | √ | √ | √ | |||
补题 |
题目 | A1 | A2 | B | C | D | E |
---|---|---|---|---|---|---|
通过 | √ | √ | √ | |||
补题 | √ |