2019年8月8日木曜日

ARC 083 E - Bichrome Tree

ARC 083 E - Bichrome Tree

頂点vvが与えられたとき、vvの部分木でvvと同じ色の重みの和はXvX_vと決まっているが、もう一方の色の重みの和については割り当て次第である程度動かせるはず。そして、この重みの和は、小さい分には先祖の重みの割り当て方が増えるだけなので、小さければ小さいほど良いはず。

そこで、f(v)f(v)を次のように定める: 部分木vvで、vvと同じ色の重みの和がXvX_vになるように重みを割り当てたときの、もう一方の色の重みの和の最小値。

ffの漸化式について考える。頂点vvの子をc1,...,ckc_1, ..., c_kとする。部分木cic_iの重みの和は、一方の色がXciX_{c_i}、もう一方の色が少なくともf(ci)f(c_i)である。つまり、kk個の部分木の重みの決め方は

Xc1X_{c_1} Xc2X_{c_2} XckX_{c_k}
f(c1)f(c_1) f(c2)f(c_2) f(ck)f(c_k)

から上下の2択がkk個あるので2k2^k通り考えられて、一方の色の重みの和をXvX_v以下にするという条件でもう一方の色の重みの和を最小にできれば、その値がf(v)f(v)である。これはナップサック問題のようなDPで求まる: gv(y,z)g_v(y, z)を、部分木c1,...,cyc_1, ..., c_yの一方の色の重みの和がzz以下であるという条件下でのもう一方の色の重みの和の最小値とする。このとき、f(v)=gv(k,Xv)f(v) = g_v(k, X_v)である。gvg_vの漸化式は次のように書ける:

gv(0,z)=0g_v(0, z) = 0

gv(y,z)=min(gv(y1,zXy)+f(y),gv(y1,zf(y))+Xy,+)g_v(y, z) = \min(g_v(y-1, z-X_y)+f(y), \: g_v(y-1, z-f(y))+X_y, \:+\infty)

途中でf(v)=+f(v) = +\inftyとなったら答えはIMPOSSIBLEである。(ただし、それぞれzXy0,zf(y)0z - X_y \ge 0, z-f(y) \ge 0でない場合は除いて計算する。また、vvが子を持たない場合はf(v)=0f(v) = 0だが、この計算式のままでも自然にf(v)=gv(0,Xv)=0f(v) = g_v(0, X_v) = 0となるので特別扱いしなくても書ける。)

計算量について。木のそれぞれの頂点vvについてDPすることになり、その計算量はO(vXv){\mathcal O}(vの子の数 \cdot X_v)である。したがって、全体ではO(NmaxiXi){\mathcal O}(N\max_i X_i)