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)$ 。

posted @ 2022-02-16 14:47  xjqxjq  阅读(37)  评论(0编辑  收藏  举报