D - grepマスター Editorial by first_vil


各grepで表示される行は

  1. 各 $i(1 \le i \le N)$ について $L_i$ 行目
  2. $1$ 行目から $L_1-1$ 行目
  3. $L_N+1$ 行目から $all$ 行目
  4. 各 $i(1 \le i \lt N)$ について $L_i+1$ 行目から $L_{i+1}-1$ 行目

の $4$ 種類に分類できます。以降はそれぞれについて行数を数えていきます。

1.は $x,y$ に関わらず常に $N$ です。

2.は $\min(L_1-1,x)$ です。

3.は $\min(all-L_{N},y)$ です。

4.は $D_i=L_{i+1}-L_i-1(1 \le i \lt N)$ として $\displaystyle \sum_{i=1}^{N-1} \min(D_i,x+y)$ です。 $D$ をソートすると、$\min$ 内で $D_i,x+y$ のどちらが選ばれるかは $D$ のindexの $1$ つの境界で二分されます。 よって二分探索でこの境界を探し、累積和などを用いることでこの式の値を求めることができます。 なお、$L_i$ と $L_{i+1}$ が隣接している場合はこの限りではありませんので適宜取り除いてください。

最後に上述の \(4\) つを合計して出力することで各クエリには \(O(\log N)\) で答えることができます。以上でこの問題が解けました。

posted:
last update: