题解:[洛谷 P8004] Welcome to Lunatic City
感觉是一个 \(\mathcal O(n)\) 做法。
下文中 \(deg\) 指以 \(1\) 为根儿子个数。
问题可以转化为构造另一棵以 \(1\) 为根的树,使得每个点的 \(deg\) 不变,且所有关键点的深度之和最小。转化过程略去。
首先是一个结论:将所有点按以度数为第一关键字,是否为关键点为第二关键字排序得到 \(p_1,p_2,\dots,p_n\)(钦定 \(p_1=1\)) 那么一定存在一个 \(1\le k\le n\),使得最优答案由保留 \(p_{1\sim k}\),将 \(p_{k+1\sim n}\) 按照以是否为关键点为第一关键字,度数为第二关键字重排后得到的排列取到。也就是依次填完 \(p_{1\sim k}\) 后接着填剩下的所有关键点,再填剩下的非关键点。
证明考虑如果这样取不到最优,最优的树长什么样。可以发现会存在第 \(i\) 层一个关键点 \(x\),第 \(i+1\) 层一个非关键点 \(y\) 使得 \(deg_y>deg_x\),且第 \(\ge i+2\) 层存在关键点。此时交换 \(x,y\)(原来 \(x\) 的子树都接在 \(y\) 下面,\(y\) 的前 \(deg_x\) 个子树接在 \(x\) 下面),只有一个关键点深度 \(+1\),如果 \(y\) 的后 \(deg_y-deg_x\) 个子树中有关键点则调整不劣,否则将其中任意一个子树和 \(\ge i+2\) 层的关键点交换也不劣。
考虑枚举 \(k\) 求答案,设现在的树在第 \(d\) 层还有 \(y\) 个空位,第 \(d+1\) 层还有 \(x\) 个空位,现在需要求出将 \(p_{k+1\sim n}\) 中的关键点依次填进去后他们的深度和。
先把前 \(y\) 个填进去,得到 \(x^{\prime}\) 个都在 \(d+1\) 层的空位。接下来考虑暴力:先把前 \(x_0=x^{\prime}\) 个点填在 \(d+1\) 层,设 \(x_1\) 为他们的度数和,则 \(d+2\) 层有 \(x_1\) 个空位,再填接下来的 \(x_1\) 个点,然后得到 \(x_2\),以此类推。
考虑优化。可以发现,在填入 \(deg\le 1\) 的关键点之前,都有 \(x_i\ge 2x_{i-1}\),所以这样至多填 \(\log\frac{n}{x_0}\) 层,而后面度数均为 \(1,0\) 的部分是容易 \(\mathcal O(1)\) 算的。而且可以认为,\(p_{2\sim k}\) 度数都不小于 \(2\),所以有 \(x_0=x^{\prime}\ge k\),那么这部分总复杂度为 \(\sum_{k=1}\mathcal O(\log\frac{n}{k})=\mathcal O(n)\)。
这里的复杂度分析是:
前面的排序和后面的构造容易线性,故总复杂度 \(\mathcal O(n)\)。

浙公网安备 33010602011771号