Official

B - Range Argmax Editorial by maroonrk_admin


\(x\) に対する \(p\) が複数あるため,数えるのが一見難しいです. そこで,\(x\) に対してちょうど \(1\) つの \(p\) を対応させるようにします.

\(x\) が与えられたとき,以下の手順で \(p\) を構成することにします.

  • \(p=(-1,-1,\cdots,-1)\) とする.
  • \(v=N,N-1,\cdots,1\) について,以下のことを行う.
    • \(p\) の中で \(v\) にすることが可能な位置を探す.その中で最も左の要素を \(v\) にする.

こうして生成されうる \(p\) の個数を数えます.

\(p_m=N\) となる \(m\) を固定します. \(m\) を跨ぐような区間 \(i\) については,すべて \(x_i=m\) となります. よって,\(m\) より左の部分と右の部分で問題を独立に解くことができます. 右の部分は簡単で,そのまま元の問題と同じ形式の問題を解けばよいいです.

左の部分を考えます. 左の部分の中で \(p\) の最大を取る index が \(k\) だったとします. もし,\(k\)\(m\) を両方含むような区間が存在しなければ,\(p_k=N\) として問題ないので,\(p_m=N\) としたことに矛盾します. 逆に \(k\)\(m\) を両方含む区間が存在していれば矛盾が起きないことがわかります. 結局,左の部分を決める際には,最大値を取る index がある範囲になくてはならない,という制約を新たに課した上で同じ問題を解けばよいとわかります.

ここまでわかれば DP が可能です.各 \(l \leq m \leq r\) について,「区間 \([l,r]\) だけを見たときの \(p\) の決め方であって,最大値を取る index が \(m\) 以上のもの」の個数を数えればよいです. この DP は \(O(N^3)\) で実装可能です.

posted:
last update: