1. 程式人生 > 其它 >記錄【P3047 [USACO12FEB]Nearby Cows G】

記錄【P3047 [USACO12FEB]Nearby Cows G】

傳送門

$\texttt{Description}$

給定一棵樹,邊權為 $1$,點有點權,對於每一個點輸出與它距離不超過 $k$ 的所有點的點權和。

$1\le n\le 10^5$,$1\le k\le 20$。

$\texttt{Solution}$

考慮樹形 $\texttt{DP}$,設 $f_i$ 為 $i$ 點的答案。

但我們發現這樣很難去搞 $\texttt{DP}$,因為距離無法確定。

所以考慮再加一維狀態,$f_{i,j}$ 表示距離 $i$ 不超過 $j$ 的點的點權和。

這樣就可以愉快的轉移了。

很套路的,要搞一個 $g_{i,j}$,表示在以 $i$ 為根的子樹中,距離 $i$ 不超過 $j$ 的點的點權和。

很容易地寫出狀態轉移方程:$f_{v,j}=f_{u,j-1}+g_{v,j}-g_{v,j-2}$。

然後 $g_{v,j}-g_{v,j-2}$ 可以表示成 $sum_{v,j}+sum_{v,j-1}$,其中 $sum_{i,j}$ 表示在以 $i$ 為根的子樹中,距離 $i$ 恰好為 $j$ 的點的點權和。

$sum_{i,j}$ 可在第一次 $\texttt{dfs}$ 中通過遞推來得到。$sum_{u,j}=\sum_{\text{v is a son of u}}sum_{v,j-1}$。

然後就做完了。