2019年12月2日月曜日

JOI2010 春合宿 - Stairs

xx段目の地面からの高さをHxH_xとし、xx段目までの上り方の総数をf(x)f(x)とする。HlHxPH_l \ge H_x - Pとなるような最小の段をll段目とするとき、ffの漸化式は

f(x)=t[l,x)f(t) f(x) = \sum_{t \in [l, x)}f(t)

と書ける。このままDPすると間に合わないので累積和S(x):=t=0xf(t)S(x) := \sum_{t=0}^xf(t)を考える。

f(x)=S(x1)S(l1) f(x) = S(x-1) - S(l-1) S(x)=f(x)+S(x1) S(x) = f(x) + S(x-1)

が成り立つから、SSの漸化式は

S(x)=2S(x1)S(l1) S(x) = 2S(x-1) - S(l-1)

とまとまる。SSに関してDPすればよい。答えはf(N)=S(N)S(N1)f(N) = S(N)-S(N-1)である。

毎回llを二分探索で求めると計算量はO(NlogN){O}(N\log N)。尺取り法でO(N){O}(N)