给定一颗树,你有一次将树改造的机会,改造的意思是删去一条边,再加入一条边,保证改造后还是一棵树。
考虑一次$dp$。
$dp[x]$表示$x$子树内不超过$n/2$的最大子树的大小。
$ans=(siz[maxsiz[x]]-dp[maxsiz[x]])\leq n/2$
显然不能直接每个暴力。
考虑换根$dp$
$h[x]$表示外子树的子树里不超过$n/2$的最大子树的大小。
判断的时候再加上外子树的大小即可。
考虑如何维护$h[x]$
$if(n - siz[x] > n / 2)$那么所需要要的一定再外子树上,$h[to]=max(h[x],dp[x]去掉dp[to]$),
$if(n - siz[x] <= n / 2)$那么$x$的外子树就是最大的$h[x]$,$h[to]=max(n-siz[x],dp[x]去掉dp[to]$),
$dp[x]$去掉$dp[to]$搞个最大值和次大值。
代码
1 |
|