由点,到链,再连成环。维护点的信息,点到链的信息,然后把两条链合成环去计算
因为添加的边不能为自环也不能为原树中的边,所以连成的环长度至少为 \(2\),分是否是直链计算
令 \(siz\) 表示子树内所有点的权值和,\(dis\) 表示子树内所有点深度乘权值的和,\(f\) 表示子树内所有点到从子树根开始的一条直链的距离乘权值的和
对于直链的情况,需要知道子树外到子树根的信息,所以需要换根维护子树外的 \(dis\) 和 \(f\);对于非直链的情况,需要选出子树根开始的两条不交直链,所以需要维护 \(f\) 的最大和次大
环长度至少为 \(2\) 相当于链长度至少为 \(1\),将 \(f\) 初始化为极小值,在链延长或者转移取长度可以为 \(0\) 的链时与 \(dis\) 取 \(\max\) 即可