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\) になるまで以下を繰り返す.(もし途中で操作できなくなった場合は作ることができない.)
- 以下を満たす \(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\) が存在する
- \(A_l,\ldots,A_r\) をすべて \(0\) にする.
- 以下を満たす \(l,r\) を選ぶ.(そのような \((l,r)\) が複数存在する場合は辞書順最小を選ぶ)
(判定手順内で選ぶ \((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:
