記錄【CF1187E Tree Painting】
傳送門。
$\texttt{Description}$
給定 $n$ 個節點的樹,初始每個點為白色,進行 $n$ 次操作,每次選擇一個與一個黑點隔一條邊的白點,將它染黑,然後獲得該白點被染色前所在的白色聯通塊大小的權值。一開始可以操作任何點。求最大權值。
$1\le n\le 2\times 10^5$。
$\texttt{Solution}$
非常好的一道換根 $\texttt{DP}$。
我們不妨先對一個子樹進行思考,設 $g_i$ 表示以 $i$ 為根的子樹中,選擇了 $i$ 後的最大貢獻。
顯然可以得到 $g_i=siz_i+\sum_{j\in son_i}g_j$。
因為第一次選了 $i$ 後可以獲得整個子樹大小的權值,之後一步只能選擇 $i$ 的兒子。
我們設 $f_i$ 表示以 $i$ 為根時,先選 $i$ 後整棵樹的最大權值。
這就像是一個換根 $\texttt{DP}$ 的正確姿勢了。
先來表示 $f_1$,顯然 $f_1=g_1$。
然後考慮換根。
若 $v$ 是 $u$ 的一個兒子。考慮 $f_v$ 的轉移:
$$f_v=n+(n-siz_v+\sum_{i\in son_u\land i\neq v}g_i)+(\sum_{i\in son_v}g_i)$$。
第一個 $n$,表示選擇了 $v$ 這個點,獲得了整棵樹的價值。
考慮第二個括號,表示是在以 $u$ 為根的前提下把 $v$ 這個子樹刨去所得到的價值。一開始都是白點,可以獲得這個子樹的大小,即整個樹的大小減去 $v$ 子樹的大小。
之後再把所有兒子的貢獻加起來。
考慮第三個括號也很顯然,就是計算 $v$ 子樹的貢獻。即 $v$ 的所有兒子的貢獻之和。
這個柿子顯然可以化簡,別忘記一開始我們求的 $g_i$,第三個括號可以直接換成 $g_v-siz_v$。
然後發現 $\sum_{i\in son_u\land i\neq v}g_i)+g_v$ 是可以合併的,即為 $\sum_{i\in son_u}g_i$。
所以最終
$$f_v=n-2siz_v+(\sum_{i\in son_u}g_i+n)$$
但這個 $\sum$ 我們不想要,發現後面那個括號的東西其實就是以 $u$ 為根時的答案。即 $f_u$。
那麼我們最終的 $\texttt{DP}$ 轉移方程就躍然紙上了:
$$f_v=n-2siz_v+f_u$$。