ARC 083 E - Bichrome Tree
頂点vが与えられたとき、vの部分木でvと同じ色の重みの和はXvと決まっているが、もう一方の色の重みの和については割り当て次第である程度動かせるはず。そして、この重みの和は、小さい分には先祖の重みの割り当て方が増えるだけなので、小さければ小さいほど良いはず。
そこで、f(v)を次のように定める: 部分木vで、vと同じ色の重みの和がXvになるように重みを割り当てたときの、もう一方の色の重みの和の最小値。
fの漸化式について考える。頂点vの子をc1,...,ckとする。部分木ciの重みの和は、一方の色がXci、もう一方の色が少なくともf(ci)である。つまり、k個の部分木の重みの決め方は
|
|
|
|
Xc1 |
Xc2 |
… |
Xck |
f(c1) |
f(c2) |
… |
f(ck) |
から上下の2択がk個あるので2k通り考えられて、一方の色の重みの和をXv以下にするという条件でもう一方の色の重みの和を最小にできれば、その値がf(v)である。これはナップサック問題のようなDPで求まる: gv(y,z)を、部分木c1,...,cyの一方の色の重みの和がz以下であるという条件下でのもう一方の色の重みの和の最小値とする。このとき、f(v)=gv(k,Xv)である。gvの漸化式は次のように書ける:
gv(0,z)=0
gv(y,z)=min(gv(y−1,z−Xy)+f(y),gv(y−1,z−f(y))+Xy,+∞)
途中でf(v)=+∞となったら答えはIMPOSSIBLE
である。(ただし、それぞれz−Xy≥0,z−f(y)≥0でない場合は除いて計算する。また、vが子を持たない場合はf(v)=0だが、この計算式のままでも自然にf(v)=gv(0,Xv)=0となるので特別扱いしなくても書ける。)
計算量について。木のそれぞれの頂点vについてDPすることになり、その計算量はO(vの子の数⋅Xv)である。したがって、全体ではO(NmaxiXi)。