2020年1月20日月曜日

EDPC X - Tower

問題文と制約を見てO(Nmaxsi){O}(N \max s_i)で解くしかないという気持ちになる。順番が固定されていないが、固定されていないと難しすぎるのでその方法を探す。

丈夫さについても重さについても、大きいブロックは下に置いたほうが良いはずなので、まずはsi+wis_i+w_iで降順にソートするという案を思いつく。実際、それでよいことが証明できる。有効なタワーが与えられたとし、丈夫さと重さが下のブロックから(s1,w1),(s2,w2),...,(sk,wk)(s'_1, w'_1), (s'_2, w'_2),..., (s'_k, w'_k)になっているとする。隣り合うブロックでsi+wisi+1+wi+1s'_i + w'_i \le s'_{i+1} + w'_{i+1}が成り立つペアがあったとき、ブロックiiとブロックi+1i+1を入れ替えても有効なタワーのままであることが示せれば十分である。

ブロックiii+1i+1を入れ替えたとき、1,...,i11, ..., i-1番目とi+2,...,ki+2, ..., k番目のブロックにかかる重さは変わらず、ii番目だったブロックにかかる重さは減るので、i+1i+1番目だったブロックについてだけ考えればよい。このブロックに以前掛かっていた重さをGGとすると、新しい配置で掛かる重さはG+wiG+w'_iになる。ところでii番目だったブロックは丈夫さsis'_iで重さG+wi+1G+w'_{i+1}に耐えていたのでsiwi+1Gs'_i - w'_{i+1} \ge Gが成り立つ。si+wisi+1+wi+1s'_i + w'_i \le s'_{i+1} + w'_{i+1}からsi+1wisiwi+1Gs'_{i+1} - w'_i \ge s'_i - w'_{i+1} \ge Gが従い、丈夫さsi+1s'_{i+1}G+wiG+w'_iに耐えられることがわかる。従って、ブロックiii+1i+1を入れ替えてもタワーは有効である。\square

si+wis_i+w_iの降順に並んだタワーだけ考えればよいことがわかったので、あとは端からDPすればよい。dp[x][y]:=\operatorname{dp}[x][y] := ブロック1,2,...,x1, 2, ..., xから作れて、耐えられる重さがyyであるようなタワーの価値の最大値、とする。

dp[x+1][min(ywx+1,sx+1)]max(,dp[x][y]+vx+1) \operatorname{dp}[x+1][\min(y-w_{x+1}, s_{x+1})] \leftarrow \max (*, \operatorname{dp}[x][y] + v_{x+1}) dp[x+1][y]max(,dp[x][y]) \operatorname{dp}[x+1][y] \leftarrow \max(*, \operatorname{dp}[x][y])

と遷移すればよい。(*は左辺)