Official

M - 棒の出荷/Shipping Sticks Editorial by QCFium


答えを二分探索します。判定問題である、「全ての棒を長さ \(a\) 以上 \(b\) 以下にできるか」という問題が高速に解ければよいです。

dp[\(i\)] : 左から \(i\) 番目の切れ込みまでで条件を満たすことが可能か

と定義し、この配列の値を求めることを考えます。便宜上棒の左端を「左から \(0\) 番目の切れ込み」、右端を「左から \(N\) 番目の切れ込み」とすると実装が楽です。
\(i\) を小さい順に見ていき、dp[\(i\)] が true なら、「\(i\) 番目の切れ込みから右に距離 \(a\) 以上 \(b\) 以下の切れ込み」の範囲の dp 配列の値を trueにするという処理でよいです。
これを愚直に処理すると \(\Theta(N^2)\) かかってしまうので、範囲を求めるためには尺取り法、又は \(A\) の累積和と二分探索を使います。また、dp テーブルのある範囲を全て true にする処理は、 imos 法を、最後に一気に累積和を取るのではなく \(i\) が増えるにつれ少しずつ累積和を取る要領でできます。
尺取り法を用いた場合判定問題は \(O(N)\) で解くことができ、全体で \(O(N \log(L))\) で解くことができます。

posted:
last update: