本质上不难,需要点观察力,最后还是自己做出来了耶耶。
首先对于单点的情况 \(f_{u,i}\) 表示 \(u\) 子树选择了 \(i\) 个关键点的最优值,做到 \(O(n^2)\)。正常直接换根的话复杂度 \(O(n^3)\),注意到这是 CF 不是 CCF 所以显然过不了。
于是考虑优化,首先单次询问肯定优化不了且 dp 不具有什么特殊性。假定根 \(1\) 换到子节点 \(p\) 会导致的权值变化,则对于一个集合 \(S\),其权值的变化为 \((k-t)w_p-tw_1\),其中 \(t\) 为 \(p\) 子树关键点个数。发现 \(t \le sz_u\) 就非常符合 “子树背包” 的 \(O(n^2)\) 特性!于是可以直接 \(f_{u,i}\) 表示 \(u\) 子树选了 \(i\) 个,且终点为 \(fa_u\) 的最小代价,于是左右转移一下做到树形背包复杂度,即 \(O(n^2)\)。
