Official

G - 01Sequence Editorial by sugarrr


数列 \(B=(B_0,B_1,\dots,B_N)\) を定義します。
\(B_i\) は、\(A_1,A_2,\dots,A_i\) に含まれる 0 の数です。

条件は以下のように言い換えられます。

\(A_{L_i},A_{L_i+1},\dots,A_{R_i}\)1\(X_i\) 個以上含まれる
\(\Leftrightarrow A_{L_i},A_{L_i+1},\dots,A_{R_i}\)0\(R_i-L_i+1-X_i\) 個以下含まれる
\(\Leftrightarrow B_{R_i}-B_{L_i-1} \leq R_i-L_i+1-X_i \cdots (1)\)

また、

\(B_i \leq B_{i+1}\cdots (2)\)
\(B_{i+1} \leq B_i +1 \cdots (3)\)
\(B_0=0 \cdots (4)\)

も成り立ちます。

\((1),(2),(3),(4)\) 全てを満たす \(B\) から \(A\) の復元は容易で、かつ \(A\) は、( 1 の数を最小化するという条件以外の)条件を全て満たします。

よって、\((1),(2),(3),(4)\) を全て満たし、\(B_N\) が最大となるような \(B\) を考える問題に帰着されました。

これはいわゆる「牛ゲー」です。

「牛ゲー」とは?

\(d_j-d_i \leq w_{ij}\) という制約がいくつか与えられている
\(d_T-d_S\) の最大値を求めたい

という問題は最短経路問題に帰着することができ、このテクニックは「牛ゲー」と呼ばれています。

(「牛ゲー」の解説はネットにたくさんあるのでここでは解説しません。)


具体的には、頂点 \(0\) 、頂点 \(1\)\(\dots\) 、頂点 \(N\) からなる \(N+1\) 頂点のグラフを用意し、

\((1)\):頂点 \(L_i-1\) から頂点 \(R_i\) へ、コスト \(R_i-L_i+1-X_i \) の辺
\((2)\):頂点 \(i+1\) から頂点 \(i\) へ、コスト \(0\) の辺
\((3)\):頂点 \(i\) から頂点 \(i+1\) へ、コスト \(1\) の辺

を張り、頂点 \(0\) からの最短距離を求めると、\(B\) が得られます。

辺のコストは全て非負なので、ダイクストラ法が使えて十分高速です。

posted:
last update: