CF1119F Niyaz and Small Degrees 题解
首先 \(O(n^2 \log n)\) 的 dp 是 simple 的,我们设 \(dp_{i,0/1}\) 表示以 \(i\) 为根, \(i\) 到 \(fa_i\) 这条边删/不删的最小权值和。转移是一个非常 trick 的问题,只需要假设所有都选 \(dp_{i,0}\) ,然后把所有儿子按照 \(dp_{v,1} + w(u,v) - dp_{v,0}\) 排序,选前 \(deg_u - X\) 个即可。其中 \(X\) 为你在外层枚举的限制度数。
排序可以直接 sort ,但为了方便优化复杂度,我们用堆来实现
这里有一个非常关键的点:我们发现对于 \(deg_u \leq X\) 的这些点他们并不会对答案产生很大的影响,因为他们是不会自己主动删边的,顶多是和他们相连的点删边后牵连到了他。因此我们考虑把这些节点删掉,而和他相连的边合并到每个未被删掉节点的堆中,这样原来的树就会慢慢变成几个比较稀疏的森林,然后问题就变得好做了。对于每一个森林,我们只需要像朴素 dp 转移一样暴力取出前 \(deg_u - X\) 个最大的值然后更新答案即可,最后别忘了再把堆还原回去
这复杂度感觉不对,但又感觉是对的,因为直觉上不会所有节点的 \(deg_u\) 都很大。我们发现一个点 \(u\) 只会堆
\[\sum_{i=0}^{n-1} \sum_{u = 1}^{n} [deg_u > i] = 2(n-2)
\]
的,因此复杂度是 \(O(n \log n)\)