Codeforces Round #527 (Div. 3)F. Tree with Maximum Cost
問題概要
頂点の木が与えられる. 頂点 には値 が割り当てられている. 頂点 に対し関数 を
と定義する. を自由に選べるとき, の最大値はいくらか?
制約
解法
典型的な全方位木dpの問題です. 全方位木dpがわからない方はまずググってください.
最初に部分木についての問題を解きましょう. これは普通に木dpをすればいいです. (頂点 の部分木についての の値), (頂点 の部分木にある頂点についての の総和) という風に定義すれば, 頂点 についてその の値は, 全ての の子頂点 について を足しあげた値になります. これは, 子頂点の に加え, 間の辺を通ることによって加算される量が に等しいことを利用しています(実験してみてください).
ここまでできればあとは全方位木dpするだけです. を頂点 の最終的な答えだとすれば, その子頂点 の答えは
です( は の総和です). 自分の部分木の答え(第 項)に加え, 自分の親頂点の答え(第 項)から自分の部分木の影響(第 項)を除いた後, 親頂点を自分の部分木としてマージする係数(第 項)がついてこの式になります.
あとは適当に dfs すればおしまいです.
実装
Submission #146591764 - Codeforces