杂题选做 10
[CEOI 2026] Birdwatchers
好题。
记子树和为 \(s_u\),观察所有满足 \(s_u \ge \dfrac{M}{2}\) 的点的形态,可以发现它们全都位于一条根到某个点的链上。证明考虑一个点只多有一个 \(s_u \ge \dfrac{M}{2}\) 的儿子。
考虑修改会影响什么。具体的影响是,假设 \(x\) 的原父亲为 \(f_x\),那么会将 \(f_x \to \text{lca}(y,f_x)\) 这一段的 \(s_u\) 减掉 \(s_x\),将 \(y \to \text{lca}(y,f_x)\) 这一段的 \(s_u\) 加上 \(s_x\)。而原本不满足条件的 \(u\),若子树大小没有变化甚至减少,自然不可能成为新的答案,因此只需考虑子树大小增加的部分,以及上一次修改中满足条件的点即可,即上一次答案到根的链,以及移动子树后 \(x\) 到根的链。
那么问题转化为,给定一条 \(x\) 到根的链,求链上最深的点 \(u\) 满足 \(s_u \ge \dfrac{M}{2}\)。
显然我们只需要在修改下支持查询子树和,以及查询 \(k\) 级祖先即可。
但是朴素地使用树剖并不好在移动子树这种修改下维护信息,于是我们考虑如何将树压成序列,使得一个子树的信息能够较好的被表示。不难想到使用 dfn 维护,这样操作可以被表示为一个区间截取出来移动到另一个位置。但是 dfn 无法记录祖先信息,而我们还需要支持求 \(k\) 级祖先,如何才能让祖先信息更好的表示呢?
我们将 dfn 换为树上括号序,记 \(\text{in}_u\) 为 \(u\) 第一次在括号序中出现的位置,\(\text{out}_u\) 为 \(u\) 第二次在括号序中出现的位置。在括号序上,若该位置 \(x\) 对应的是 \(\text{in}_u\),记 \(b_x=1\),否则记 \(b_x=0\),则我们可以求出点 \(u\) 的深度即为 \(\sum\limits_{i=1}^{\text{in}_u} b_i\),其 \(k\) 级祖先的深度就是该值 \(-k\)。那么,我们只需要找到括号序上最右侧的前缀和等于 \(\text{dep}_u-k\) 的位置即可。
这看似很难维护,但是这里有一个关键性质:\(b_x\) 的取值仅有 \(1\) 或 \(-1\)。这意味着,设一个区间的最大值和最小值分别为 \(\text{maxx}\) 与 \(\text{minn}\),则该区间内的 \(b\) 值一定能取遍 \([\text{maxx},\text{minn}]\)。
因此我们只需要维护一棵平衡树,节点上维护该点权值,该点的 \(b\) 值,子树权值和,子树的 \(b\) 值和,子树前缀 \(b\) 值和的最小值与最大值。查询 \(k\) 级祖先只需要在平衡树上进行二分即可。
总时间复杂度是 \(O(n \log n + q \log^2 n)\),足以通过。
[CEOI 2026] DFS
简单题。
首先显然可以唯一确定原图的 dfs 生成树,然后考虑有多少种合法连接返祖边的方案。
若 \(u \to f_v\) 的返祖边满足 \(u < v\),则遍历到 \(f_v\) 时一定会直接从 \(f_v\) 走到 \(u\),那么该边就会该边 dfs 生成树的形态,不合法。因此,我们共有“\(u\) 的祖先节点中编号比 \(u\) 小的节点个数”条返祖边可供我们选择加入或不加入,记这个数为 \(x\),则该点的贡献为 \(2^x\)。
答案为所有节点的贡献乘积,使用树状数组维护即可,时间复杂度 \(O(n \log n)\)。
[CEOI 2026] Flower Cutting
手玩一下条件可以发现等价于图中的任意两个极大完全子图边集不交。不难发现不在任意一个完全子图内的边都是不可以删的,因为能被加回去的边加回去后一定在一个 \(K_4\) 内部。
那么我们只要找出完全图的答案,然后再找出原图中所有的极大完全子图,将它们的答案相加即可。
对于完全图的情况,\(n<4\) 显然不能删除任何边,\(n=4\) 时可以删除两条边。接着考虑增量构造(这里我做的时候一直考虑每次只能加一个点,倒闭了好久),只要我们每次在上面接一个点数 \(\le 4\) 的环,那就一定可以长成一个完全图。那么加入一个点的时候可以找两个点与它连上,加入两个点的时候找两个点分别与这两个点相连,再将加入的两个点相连即可。
于是完全图被我们解决,现在只需要找出原图中所有极大完全子图即可。
这是简单的。由于所有极大完全子图边不相交,因此只需要枚举每条边 \((u,v)\),所有同时与 \((u,v)\) 连边的点加上 \(u,v\) 就构成了一个极大完全子图。不难使用 bitset 做到 \(O\left(\dfrac{nm}{w}\right)\)。
[CEOI 2026] Towers
感觉是套路题。被提示贡献能拆之后好像全都一秒想完了。
可以观察到对于单个 \(a_i<a_j\),最优的缆线一定形如找到一个 \(L \le a_i,R \ge a_j\),按照 \(a_i \to L \to R \to a_j\) 铺设。不难对每个 \(i\) 算出取到最优的 \(L_i,R_i\),那么贡献就被拆为了三段:\([L_i,a_i]\),\([a_i,a_j]\) 与 \([a_j,R_j]\)。
发现两端贡献只取决于 \(i\) 做左端点还是右端点,中间段的贡献不关心左右端点是谁,于是考虑扫描线一下,不难提出一个 \(O(n^2)\) 的 dp:\(f_{i,j}\) 表示考虑了前 \(i\) 个电脑,\([a_{i-1},a_i]\) 有 \(j\) 条缆线经过的最大答案。
转移形如,左右偏移一位,加上一条一次函数后逐点取 \(\max\),不难通过归纳证明 \(f_{i,*}\) 在所有有效取值上是凸的,因此直接 slope trick 维护即可,时间复杂度 \(O(n \log n)\)。
[IOI 2026] Ball Machine
大战了一天。
你首先考虑一个看上去特别弱智的问题:如何得知 \(n\)?很难不想到对每个叶子一直 insert 直到返回 false,对每个叶节点成功 insert 的次数加起来即是 \(n\)。但是这种操作能带给我们的只有 \(n\) 吗?
发现,我们同时还得知了按顺序加入 \(0 \sim m-1\) 的叶子,其往上跳直到跳到一个被访问过节点的链长。那么,我们只需要得知每一条链分别被挂在了先前已确定结构的哪个位置便能完整还原整棵树。
一个简单的想法是,给编号为 \(i\) 的叶子赋权 \(m-i-1\),并用该值填满其所在的整条链,然后进行一次 collect,这样在 dfs 时如果遇到了叶子编号比自己靠后的链便会先访问它,这样就可以通过嵌套结构来识别链头挂的点是哪个。可以做到的代价为 \(m\),得分 \(47\)。
思考一下这个做法为什么不牛?我们共有 \(m\) 条链,如果我们需要给 \(m\) 条链分配两两不同的权值,那所需的值域也会达到 \(m\)。有什么办法在保证每条链有一个独有的标记的情况下还能够保证递归结构吗?
思考一下,我们需要保证递归结构,只需要让每次在主链上递归时如果有副链的儿子,优先递归它就行了。所以链头和其余部分是可以使用不同的权值的,不妨使用一个二元组 \((x,y)\) 来编号一条链,表示我们将该链链头的权值设为 \(x\),其余部分设为 \(y\)。由于需要满足前面所述的性质,需要保证任意一条链的 \(x\) 值均小于任意一条链的 \(y\) 值。
不难发现此时我们只需要 \(2\sqrt m\) 的值域就能编号所有链了。递归还原时,先递归处理掉所有挂在链头上的链,便可以得知该链所编号的二元组。之后遍历链上每个点,继续递归还原所有挂在该点上的链即可。
但是我们真的能成功编号所有链吗?使用二元组进行编号,需要满足链长 \(\ge 2\),而我们还可能有若干条链长 \(=1\) 的链,怎么办呢?
沿用我们之前的方法,假设有 \(k\) 条长度为 \(1\) 的链,我们将这若干条链编号为最小的 \(0 \sim k-1\),其余二元组编号往后平移,并在递归复原结构时加一步提前判掉这些长度为 \(1\) 的链即可。但是这样值域最劣又会来到 \(k\)。
故技重施一下,将这些链分为 \(\sqrt{k}\) 组,对每组内按上述方法赋值,共还原 \(\sqrt{k}\) 次即可。总的值域是 \(\sqrt{k}+2\sqrt{m-k}\),collect 次数是 \(\sqrt{k}+1\),最坏情况是取 \(k=\dfrac{m}{2}\),代价为 \(41\),可以通过。
[IOI 2026] Tiling Game
怎么是唐题?
手玩一下 \(n=1\) 的情况可以发现,唯一的策略是将左边两个是黑色的往左放,其余往右放。扩展这个想法,我们肯定将所有块全部当成 \(S=3\) 来做,那么对左上角为白色的块尽可能往右下角放,即选择距离右下角曼哈顿距离最近的任意一个格子放置,其余三种同理。写一下发现直接通过了,下文考虑证明这是正确的。
考虑反证,取第一次出现 \(2 \times 2\) 的黑色正方形的位置,其内部显然不可能全部是同一方块。若只由两个方块拼接构成,则取较早放下的那个方块,可以发现它更优的放置位置是向较晚放下方块移动一步,因此该方案不符合我们的放置方案;同理讨论由四个方块拼接起来的情况,仍取最早放置的位置并讨论该方块的类型,可以发现我们仍然可以在剩余四个位置中找出在我们的方案下更优的放置位置,因此我们的做法是正确的。
实现上直接通过四个堆维护即可。

浙公网安备 33010602011771号