给定一颗树
如果没有修改直径,只需要根据对一颗子树维护,每个儿子的链长的最大值,然后整体的$最大+次大值$。
可以用点分树优化,修改某个点的子树的信息
- 显然他所有与他有关的子树的结点,那么对于子树$u$,他会少了$dis(fa[u],x)$这一个权值,近而影响到了$fa[u]$这颗大子树的最大值与最小值之和,然后又影响到了整体维护的最大值。
- 第一个影响,删除或者添加堆中的元素即可。
- 第二个影响,先删除$u$,对$fa[u]$的影响,然后再重新$push$进大子树。
- 第三个影响与第二个大同小异
- 注意细节和边界!!
- 其实可用$Set$代替,据说常数过大
代码
1 |
|