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: