CF1632E Distance Tree
显然,应该要加入 $(1,v)$ 的边。
假设对于加的边为 $x$ ,最后答案为 $ans$ ,那么对于小于 $x$ 的答案不会超过 $ans$ 。
我们可以考虑如果要让答案为 $ans$ , $x$ 那条边要怎么加。
我们只关心 $dep>ans$ 的点。
因此我们希望走过 $x$ 这条边后,走到这些点的路程最短。
类似树的直径,我们需要知道这些点中距离最远的点对的距离是多少,我们把它记为 $f_{ans}$ 。
因此我们只需要知道 $f_{ans}$ ,然后对于 $x$ 和 $ans$ 做个双指针即可。
那么 $f_{ans}$ 怎么得到呢?
对于每个点 $v$ ,我们只关心它不同子树的最长、次长链,假设为 $x1,x2$ ,那么 $f_{i<x2}=\max(f_{i},x1+x2-2*dep_v)$ , $f_{i<dep_v}=\max(f_{i},x1-dep_v)$ 。
因此记录在 $f_{x2-1}$ 和 $f_{dep_v-1}$ ,最后做个后缀 $\max$ 即可。
效率: $O(n)$ 。