ARC083 E: Bichrome Tree
Livedoorブログからの移動
はてなブログからの移動
解き方
- ある頂点
i
の部分木について、黒白それぞれの重みの和を、b_i, w_i
として、それを更新していく- 黒白は入れ替えても問題ないので、違う色か同じ色かだけ考えれば良い
- 頂点
i
がleafの場合、色はどちらでもよく、重みはx_i
になる - 頂点
i
がleafでない場合- 子どもの重みの割当
b, w
をそれぞれまず計算する i
へ色と重みを割り当てると、b_i = x_i
またはw_i = x_i
を満たすが、ここでx_i
でない方はできるだけ小さい方がその後の重み割当がしやすくなる- 頂点
i
の子どものリストをc_1, c_2, ..., c_n
として、dp[j][k] = c_1, ... c_iまでを使って、重みの和がjになるような色の割り当て方があるかどうか(true, false)
と定義してDP dp[n][k] = true
となる最大のk
を用いてi
への色の割当を考える
- 頂点
- 子どもの重みの割当
- 計算量の見積もり(怪しい)
- DPについて:
k <= X_i
として問題なく、さらに各辺について、1回しかこのDPで参照されないので、解法全体を通してO(NX)
で収まるはず dp[n][k] = true
なる最大のk
を求める:O(X)
- これは各頂点について行われるので、解法全体で
O(NX)
- これは各頂点について行われるので、解法全体で
- 解法全体では
O(NX)
のはず
- DPについて: