CF708C Centroids

题意简述:
给定一棵 nn 个点的树,你可以删除一条边并增加一条边,形成一棵新树。

问每个点在进行这样的操作后,是否可能成为新树的重心。

1≤n≤4⋅1051 \le n \le 4\cdot 10^5

发现没有是一个无根树,很难处理。考虑把树的重心 rt 找出来,然后想象把这颗树从 rt 处提起来

于是对于子树内的每个点 v ,大于 ⌊n2⌋\left\lfloor\dfrac{n}{2}\right\rfloor 的部分只可能出现在 v 的父亲 u 所在联通块上。

2.png

即红色区域。那么我们需要把红色区域拆分成两个大小不大于 ⌊n2⌋\left\lfloor\dfrac{n}{2}\right\rfloor 的部分,分别接到 v 上。

拆分有几个选择,拆掉 u 的父亲所在子树(即上图 1 部分),或者把与 v 同级的子树拆掉,(即上图 2,3,4 )。

设分出来不大于 ⌊n2⌋\left\lfloor\dfrac{n}{2}\right\rfloor 的部分的最大大小为 f(v)f(v) ,那么 v 能经过一番操作后变成重心的条件为 n−siz(v)−f(v)≤⌊n2⌋n-siz(v)-f(v)\le\left\lfloor\dfrac{n}{2}\right\rfloor 。

问题转为求 $ f$ 的值 。

设 vv 的父亲为 uu,vv 的兄弟节点集合为 bro(v)bro(v)。

设 g(x)g(x) 为以 x 为根的子树中,划分出大小不超过 ⌊n2⌋\left\lfloor\dfrac{n}{2}\right\rfloor 的部分的最大大小。

f(v)=max⁡{f(u)max⁡i∈bro(v)g(i)n−siz(v)(n−siz(v)≤⌊n2⌋)f(v)=\max\begin{cases}f(u)\\\max\limits_{i\in bro(v)} g(i)\\n-siz(v)\quad (n-siz(v)\leq \left\lfloor\dfrac{n}{2}\right\rfloor)\end{cases}

套路: 发现 g(u)g(u) 的来源:max⁡{g(v),max⁡i∈bro(v)g(i)}\max\{g(v),\max\limits_{i\in bro(v)}g(i)\},所以可以优化求 max⁡i∈bro(v)g(i)\max\limits_{i\in bro(v)} g(i) 的过程。

设 g(u,0)g(u, 0) 表示最大值,g(u,1)g(u,1) 表示次大值,则有:

f(v)=max⁡{f(u)g(u,0)g(u,0)≠g(v,0)g(u,1)g(u,0)=g(v,0)n−siz(v)(n−siz(v)≤⌊n2⌋)f(v)=\max\begin{cases}f(u)\\g(u,0)\quad g(u,0)\neq g(v,0)\\g(u,1)\quad g(u,0)=g(v,0)\\n-siz(v)\quad (n-siz(v)\leq \left\lfloor\dfrac{n}{2}\right\rfloor)\end{cases}

gg 很好求。