D - Range Replace 2 Editorial by toam


\(A[L:R]\) が以下の条件を満たすとき,\(A[L:R]\) を極大な区間と呼ぶことにします.

  • \(i=L,\ldots,R\) に対して,\(A_i = r(r-1)/2+l\) を満たす \((l,r) (L\leq l\leq r\leq R)\) が存在
  • \(i=L,\ldots,R\) に対して,\(l\leq i\leq r\) を満たす操作を禁止すると,\(A\) を作ることができない.

操作によって作ることができる \(A\) は,極大な区間または \((0)\) の連結で表現できます.以下では一つの極大な区間からなる数列(極大な数列と呼ぶ)の個数を考えます.

操作を逆順に見ると,\(A\) を作ることができるかは以下の手順で判定できます.

  • すべての要素が \(0\) になるまで以下を繰り返す.(もし途中で操作できなくなった場合は作ることができない.)
    1. 以下を満たす \(l,r\) を選ぶ.(そのような \((l,r)\) が複数存在する場合は辞書順最小を選ぶ)
      • \(i=l,\ldots,r\) に対し \(A_i\in \lbrace 0,r(r-1)/2+l\rbrace\) である
      • \(A_i= r(r-1)/2+l\) となる \(i\) が存在する
    2. \(A_l,\ldots,A_r\) をすべて \(0\) にする.

(判定手順内で選ぶ \((l,r)\) の具体例(\(A_i=r(r-1)/2+l\) となる \(l,r\)\([l, r]\) で表しています. ))

(抽象化した判定手順)

作ることができる数列と判定の操作列は一対一対応します.作ることができる長さ \(n\) の極大な数列の操作列を数えることにします.

操作列の最後の操作を \(l_{\mathrm{last}},r_{\mathrm{last}}\) とします.最後の操作をする前は,極大な区間の列 \([L_1:R_1],\ldots,[L_m:R_m]\ (L_1\leq R_1\lt \ldots \lt L_m\leq R_m)\) が存在して,\([L_1:R_1],\ldots,[L_m:R_m]\) 内でそれぞれ完結する操作がこの順番で行われます.

どの \(i\) に対しても \(L_i\leq j\leq R_i\) とならない \(j\) が必ず存在します(極大の条件より).そのような \(j\) のうち最小のものを \(j_{\mathrm{left}}\) とします.

\(l_{\mathrm{last}},r_{\mathrm{last}}\) は次を満たす必要があります.

  • \(L_1\neq 1\) なら \(l_{\mathrm{last}}=1\),そうでないなら \(L_1\leq l_{\mathrm{last}}\leq R_1\) (極大の条件より)
  • \(R_m\neq n\) なら \(r_{\mathrm{last}}=n\),そうでないなら \(L_m\leq r_{\mathrm{last}}\leq R_m\) (極大の条件より)
  • - 区間 \([L_m:R_m]\) における \(j_{\mathrm{left}}\)\(j'\) としたとき,\(j'\leq r_{\mathrm{last}}\)
    • これは,操作列の定義で「そのような \(l,r\) が複数存在する場合は辞書順最小のものを選ぶ.」としたところから従う.

以上のような特徴づけを行うことで,長さが \(1,2,\ldots,n-1\) の極大な数列の個数(操作列の個数)が \(j_\mathrm{left}\) ごとに分かっていれば,長さ \(n\) の極大な数列の個数を多項式時間で求められます.必要な情報をまとめてうまく持つと \(O(n)\) で求められます.

(具体的には,左から順番にどうするかを決めていったときに,「\(l_{\mathrm{last}}\) がまだ決まってないものの個数」「\(j_{\mathrm{left}}\) がまだ決まってないものの個数」「\(j_{\mathrm{left}}\) が決まったものの個数」「\(j_{\mathrm{left}}\) が決まったものすべてに対する \(j_{\mathrm{left}}\) の総和」などを持てば良いです.)

よって,この問題は \(O(N^2)\) で解けました.\(O(N\log ^2 N)\) で解くことも可能です.

posted:
last update: