Official

D - Convex Sequence Editorial by maroonrk


\(A_i\) の中で最小を取る \(i\) (そのようなものが複数ある場合は最小の \(i\)) をとり,\(m\) と置きます.

\(m\) を固定したとします. この時あり得る \(A_i\) は,以下の手順で得られる数列に限られます.

  • 定数 \(C\) を選び,\(A=(C,C,\cdots,C)\) と初期化し,以下の \(2\) つの操作を繰り返す.
  • \(i < m\) を選び,\(A_i,A_{i-1},\cdots,A_1\) に,\(1,2,3,\cdots\) を足し込む.(この操作を \(i=m-1\) として少なくとも \(1\) 回は実行する必要がある)
  • \(i > m\) を選び,\(A_i,A_{i+1},\cdots,A_N\) に,\(1,2,3,\cdots\) を足し込む.

すると結局問題は,重み \(N,1,3,6,\cdots\) のアイテムがあり,それらを組み合わせて \(M\) にする方法は何通りか,となります. アイテムの種類数は \(O(\sqrt{M})\) 通りだけ考えればよいので,これは \(O(M\sqrt{M})\) で解けます.

\(m\) が固定されていない場合を考えます.\(m=1,2,\cdots\) と変化させることにします.\(m\) を変化させるたびに,上述の DP を計算することができます.毎回一からすべて計算していては間に合いませんが,持っているアイテムの差分に注目すると,DP を \(O(M)\) で計算し直すことができます.

\(m\)は最初の \(O(\sqrt{M})\) 通りだけ考えれば良いので,全体で \(O(M\sqrt{M})\) で計算できます.

posted:
last update: