2019年12月1日日曜日

JOI2010 本戦 C - つらら

つららvvよりv+1v+1のほうが長いとき、vvv+1v+1LLに達して00に戻るまでは伸びない。この時v+1v+1からvvに辺を張ることにすると、DAGが得られる。そこで、トポロジカルソートした上で辺(u,v)(u, v)に対して

dp[v]max(dp[v],dp[u]+Lav) \operatorname{dp}[v] \leftarrow \max(\operatorname{dp}[v], \operatorname{dp}[u] + L - a_v)

と更新していけば、最終的にはdp[v]=v\operatorname{dp}[v] = v00に戻るまでの時間、となる。dp\operatorname{dp}の初期値はdp[v]:=Lav\operatorname{dp}[v] := L - a_vとしておくのがわかりやすそう。O(N){O}(N)