I - Athletic 解説 by kyopro_friends


注:この解説は公式解説と逆向きにDPしているだけです

移動によって高橋君がいる足場の高さは狭義単調減少します。よって、足場の高さが高い方から順に「この足場に来るまでに移動できる最大回数」を計算することができそうです。

もらうDPの気持ちで考えます。

\(dp[i]=\) 足場 \(i\) にいる状態になるまでの移動回数の最大値

として(計算量を無視して)次のように計算できます。

(注:擬似コードは概念をふわっと理解してもらうためのものなのでかなりいい加減です)

for j in H[j]が大きい順:
  for i in j-r..j+r:
    if H[j]<=H[i]-D:
      chmax(dp[j],dp[i]+1)

ここでもしif文がなければただの区間maxなのでセグ木を用いて高速に計算できます。

seg=セグ木
for j in H[j]が大きい順:
  seg[j]=max(seg[i-r],...,seg[i+r])+1

if文がある場合も、seg木の更新をするタイミングを後ろにずらすことで同様に処理できます。

seg=セグ木
que=セグ木の更新待ちの(index, 値)
for j in H[j]が大きい順:
  while:
    i,v=que.pop()
    if H[j]<=H[i]-D:
      seg[i]=v
  que.push((j, max(seg[i-r],...,seg[i+r])+1))

実装例

投稿日時:
最終更新: