記錄【P3047 [USACO12FEB]Nearby Cows G】
阿新 • • 發佈:2022-03-24
傳送門。
$\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}$。
然後就做完了。