1. 程式人生 > 其它 >記錄【CF1187E Tree Painting】

記錄【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$$。