P3571 [POI 2014] SUP-Supercomputer 做题笔记

生死劫

题目大意

给定一颗 \(n\) 个节点的有根树和正整数 \(k\),你可以进行如下的操作:

第一步:选择不超过 \(k\) 个互不相同的节点,满足它们的父亲均被删去。
第二步:将选择的这些点全部删去。

问最少多少次操作能够将所有点都删去。有 \(q\) 组问讯,每次问讯的树一样,但是 \(k\) 不一样,要求对这 \(q\) 组问讯做出回答。

\(n, k, q\leq 10^6\)

解析

严重怀疑这道题是从 MO 题改编而来

比较经典的一个思路是倒着做,变为每次删去叶子节点。这样的好处在与叶节点越删越少,因此每轮操作可以删去的点的数量单调不升。

考虑模拟一下倒着删的过程,发现一开始连着几次操作都删满了 \(k\) 个叶节点,后来叶节点数量小于 \(k\),于是以后的操作都删不满 \(k\) 个节点。

定义 \(c_i\) 表示深度大于等于 \(i\) 的节点数量。

假设前 \(t\) 次操作实现了每次删满 \(k\) 个节点,前 \(t\) 次操作结束时,树上叶节点数量小于 \(k\),此时树高 \(h\),此时至少还需要 \(p\) 步才能完全删光。答案显然是 \(t+p\)

\(t\geq\lceil\dfrac{c_{h+1}}{k}\rceil\)
\(p\geq h\)

证明显然,所以我们有:

\(\forall 1\leq h\leq\) 树高, 答案 \(\geq h+\lceil\dfrac{c_{h+1}}{k}\rceil\)

我们大胆猜测至少有一个不等号能取等,即:

答案 \(=\max_{h=1}^{H}h+\lceil\dfrac{c_{h+1}}{k}\rceil\)\(H\) 是树高)

所以需要找到一个能取等的贪心策略。

事实上,感性理解一下有 \(h\) 更小的方案相对可能会更加优(这样浪费比较少),所以可以考虑每次选择深度最深的 \(k\) 个叶节点删去。

证明方法是《奥数教程(高中第三分册)》介绍的『势能分析法』

定义一棵树 \(T\) 的势能函数 \(f(T)=\max_{h=1}^{H}h+\lceil\dfrac{c_{h+1}}{k}\rceil\)
假设 \(T'\) 是任意一个 \(T\) 通过一次删去 \(\min(k, \text{当前叶节点数量})\) 个深度最深的叶节点后得到树,只需证 \(F(T')\leq F(T)-1\)
考虑这次删去的节点中最浅的节点的深度是 \(d\),那么对于 \(\forall h<d, h+\lceil\dfrac{c'_{h+1}}{k}\rceil\leq h+\lceil\dfrac{c_{h+1}}{k}\rceil-1\)
对于 \(\forall d\leq h<H'\),显然有 \(h+\lceil\dfrac{c'_{h+1}}{k}\rceil\leq H'+\lceil\dfrac{c'_{H'+1}}{k}\rceil=H'\),所以只需证明 \(H'< F(T)\)
具体来说,如果 \(H'<H\),则有 \(H'<H\leq F(T)\),否则,有 \(c_{H}>k\),那么 \(H'=H<H-1+\lceil\dfrac{c_{H}}{k}\rceil\leq F(T)\)

证明完这个结论后,使用李超线段树容易维护 \(F(T)\),这道题就做完了。

总结

为什么我写题解写得跟奥数教程一样,是不是学 MO 学的

倒着做的思路是自然的,这个贪心也比较容易想到,最难的自然是证明(事实上在考场上遇到这道题直接猜结论上 DS 就做完了)。

当然做为高贵的数学联赛三等奖选手,我有不证明不写代码的强迫症。但是一般的贪心都使用反证和调整法,而这题能够用势能分析(也可以理解为第二数学归纳法)做,可能的原因是使用贪心法后,答案可以被显式表达成一个代数式,这样就方便对具体的某一次操作进行分析,从而归纳证明。因此证明贪心自然也不只有反证+调整的方法。

posted @ 2025-03-16 17:35  yanzihe  阅读(17)  评论(0)    收藏  举报