场上想出了正解太复杂了以为假了没写,结果赛后发现和正解一模一样,空悲切。
首先这一看就能 dp,考虑设 $f_i$ 表示以 $i$ 为根的子树分为若干链的最小代价,每次枚举一条以 $i$ 为端点的链,枚举另外一端 $j$。
考虑贡献,首先有这条链的贡献,其次有 $j$ 的所有儿子的子树划分为链的贡献,然后又 $i\to j$ 路径上,因为把 $i\to j$ 割掉后分出的各个子树的贡献。
设 $h_u=\sum_{v\in son(u)}f_v,g_u=\sum_{v\in bro(u)}f_v$,另外设 $s_u$ 表示根到 $u$ 的所有边权之和,$sg_u$ 表示根到 $u$ 的 $g_i$ 之和,不难写出一个转移:
$$f_u=\min_{v\in Subtree(u)}\{h_v+(s_v-s_u)^2+C+(sg_v - sg_u)\}$$
如果暴力转移,$h,g,sg$ 都可以 $O(n)$ 处理,主要是 $f$ 的转移是 $O(n^2)$ 的。
注意到这是一个经典的斜率优化形式,考虑斜率优化,因为在树上进行,考虑李超树,唯一的问题是直线的截距 $sg_u$ 可能会需要子树加。
实际上,在合并李超树的时候,顺路维护一个全局加的标记即可,这个标记可以在合并的时候打在根上。
时间复杂度为 $O(n\log n)$。