题意:树上随便选两个路径,有点权,只被一个路径覆盖的点权有效,求最大值
两种情况 一种是只有一个交点,一种无交点,无交点我们可以通过断一条树边求分别两边的最大值,记为f与g f为断u与fa后 u子树的最大值,这个比较简单,就是套路的最大次大, 然后是g
我是打死想不到O(n)的转移,没脑子 ,考虑g什么时候最简单,可以初始化 答案是 为1连着的节点时g最简单 此时情况就是断掉这个子树,将其他的最长次长链求一个和,然后取其他f[v]最大值即可,这个东西用multiset维护一下
接着是转移考虑父亲到子节点的变化 我们会多出来除了一个节点外的其他子嗣,需要将这些子嗣最长的直的链跟往上最大的链取一个最大值,这个往上最大的链子其实不一定就只到一,它可能穿过其他儿子 ,这个东西又可以用multiset维护 然后g[v]大概就完了
最后对于空心的四条链子 这个东西还是要用multiset 搞一下
最后给个图吧 对于g的转移没图还是说不清的
如图,它会多出来除了v以下的x其他的子嗣
#include <bits/stdc++.h>
using