$Description$
给出一棵树$($根是$1$$号节点 )$和$q$个询问,对于每个询问$v_i,$要求回答以$v_i$为根的子树的重心
$Solution$
先预处理出每个点$u$作为根时的答案,记为$ans[u],$最后$O(1)$回答。
记$u$的重儿子$($即$size$最大的儿子$)$为$son[u]$
考虑一个性质:如果以当前节点$u$为根$,size[son[u]]<=\frac{size[u]}{2},$所以$,ans[u]$只有可能是$u$自己或者在$son[u]$的子树中。
是$u$自己的情况根据$size[son[u]]$判断一下即可。
在$son[u]$的子树中的情况。因为$size[u]>size[son[u]],$所以$ans[u]$一定在$ans[son[u]]$的上方,因此我们只需要每次从以$son[u]$为根的子树的重心向上跳即可。
由于重心只会向上跳,所以跳的次数就是树高,所以总复杂度为$O(n)$
$Code$
1 |
|