题解:P11690 [Ynoi Hard Round 2025] 《十字神名的预言者》理解(色彩)
本题是笔者今年的集训队互测试题。
起初是 lxl 认为这道题很有价值,是一道不同寻常的数据结构题,于是询问我是否能加入 Ynoi Hard Round 2025。本着希望能有更多的人做到我的题目,于是我同意了。同时也非常遗憾,没有任何选手能在集训队互测赛时写出什么非平凡的算法。
完整的解题报告可以见此处。由于当时命制这道题的时候,分别想到了
这里只描述最终的算法,还是相当简洁的。
基本的贪心
由于
首先,我们有一个暴力的贪心做法。我们 DFS 整棵树,假设当前在结点
贪心证明
首先,由于操作都是将深度大的棋子,移到深度小的结点上去,所以我们可以将操作按照移到的结点的深度从大到小重排。
于是,我们可以把过程看成 DFS 整棵树,假设当前在结点
假设当前子树内有
假设当前可以选择移动一枚棋子到
-
选择棋子移动到
x 是不劣的,因为假设选择了第p 个棋子移动到x ,那么距离序列就变成了a'=\{0,a_1,a_2,\cdots,a_{p-1},a_{p+1},a_{p+2},\cdots,a_k\} 。注意到,
a' 序列能全维偏序a 序列(这里全维偏序是指所有对应位置的数都有a'_i\le a_i ,下同)。所以,我们可以说明选择棋子移动到
x 是不劣。 -
选择第
k 个棋子移动到x 是不劣的,因为假设选择了第p\ne k 个棋子移动到x ,那么距离序列就变成了b=\{0,a_1,a_2,\cdots,a_{p-1},a_{p+1},a_{p+2},\cdots,a_k\} 。假设选择了
a_k 移动到x ,那么距离序列就变成了b'=\{0,a_1,a_2,\cdots, a_{k-1}\} 。注意到,
b' 序列能全维偏序b 序列。所以,我们可以说明选择距离最远的棋子移动到
x 是不劣。
维护
我们考虑维护这个过程。我们记
记
我们考虑长链剖分来维护,记结点
我们先考虑计算
- 继承
f_{\mathrm{hson}_x} 的状态; - 加入轻儿子
y 贡献。由于我们维护的是后缀和,而每次修改是一段前缀,因此我们可以维护; - 将前
a_x-b_x 大删除,我们在f 数组上二分,即可更新\mathrm{sum}_x 。
我们考虑换根计算子树补的信息,这个时候跟先前两道例题的情况大不相同,我们需要新的处理方法。我们考虑把信息拆成轻重子树来处理。
我们考虑在换根的过程中重链剖分维护,记结点
我们在过程中维护:
到根路径经过的轻结点,它们的父亲的重儿子结点编号集合
-
用数组来维护
F_i 表示到x 距离\ge i 的棋子数量。
假设当前在结点
- 根据
f_x,g_x 回退出f_{\mathrm{hson}_x},g_{\mathrm{hson}_x} ; - 我们先将所有轻儿子都加入
F 里面; - 对于重儿子:不需要做额外处理;
- 对于轻儿子:我们先将结点
y 在f 内的贡献删除,然后再截取重儿子距离\le \mathrm{size}_y 的部分,对于重儿子f_{\mathrm{wson}_x} 中>\mathrm{size}_y 的部分,我们将重儿子的结点编号\mathrm{wson}_x 加入S_y 内,并记录\mathrm{size}_y ; - 将
f_{\mathrm{hson}_x},g_{\mathrm{hson}_x} 还原成f_x,g_x 。
此外,对于删除距离前
求答案时,我们如果删完
如果加入轻儿子时,在已经被删除的地方增加了棋子,则我们可以直接重构
时间复杂度