CF1534H 题解
第一次 DP 的部分和后面交互的部分现有的两篇题解都讲的比较清楚了,这里注意补充解释一下换根和计算答案的部分,(让像我这样的菜鸡容易理解一点)。
我们先列出第一次 DP 的式子: \[ f_u=\max\limits_{i=0}^{size-1} f_v+i \] 那么我们考虑当前节点是 \(u\) ,新的根是 \(v\),那么此时我们要抛弃掉 \(v\) 对 \(u\) 的贡献并且加入 \(fa_u\) 对 \(u\) 的贡献。考虑直接将与 \(u\) 相连的所有点按 \(f\) 值进行排序,那么每次的 \(v\) 将整个数组分割成一个前缀和一个后缀,式子其实就是上面那个式子,但是后缀部分的 \(i\) 要减去当前这个 \(v\) 所多算的 \(1\)。因此不需要什么平衡树,只用预处理前缀最大值、后缀最大值,中间再合并一下就好了。
计算答案的部分则是简单的分类讨论。我们在计算前仍然需要对所有儿子按 \(f\) 值排序。对于当前根是 \(u\) ,有 \(3\) 种情况:
- 询问的两个点分别在当前节点的两个不同子树内,则贡献为 \(\max f_{v0}+f_{vi}+i-1\);
- 询问的两个点中有一个是当前根,则贡献为 \(f_{v0}+deg_u-1\);
- 询问的两个点都是当前的根,则贡献为 \(deg_u\)。
放一下这个关键的 DFS 部分的代码:
1 | bool cmp(int x,int y){ |