geam1113’s diary

主にAtcoderのコンテストの備忘録を書きます。AtCoder緑と水色を行ったり来たりしています。

ABC216G 01Sequence

問題へのリンク

解説AC

牛ゲーとのことで、解法は公式解説を見るのが良いかと思います。
ここでは、自分なりの理解をつけ足したいと思います。

牛ゲーについては、別記事にまとめました。

geam1113.hatenablog.com

また、ネットで調べると色々出てきます。

牛ゲーを適用するには、以下を満たす必要があります。

  • 2値の差分の制約しかない
  • 値を最大化する

そこで今回、

  • 1の数を最小化する

ことを、

  • 0の数を最大化する

と言い換えをすることが1つポイントだと思います。

次に、以下の3つが今回の制約です。

  1. B_i \leq B_{i+1}
  2. B_{i+1} - B_i \leq 0\  \vee \ B_{i+1} -B_i \leq 1
  3. B_{R_i} - B_{L_i -1} \leq R_i - L_i +1 -X_i

制約1は自明かなと思います。

制約3は、0の数を最大化する問題とみなし、1の個数の制約を0の個数の制約に変換することで導き出されます。

制約2ですが、A_{i+1}を1にすればB_{i+1} - B_i \leq 0となり、A_{i+1}を0にすればB_{i+1} - B_i \leq 1となります。そこで、多重辺をもつような場合はどうなるのかという疑問が出ました。

おそらくですが、「0以下または1以下」なので大きい方の1以下のみが採用されます。これが、「0以下かつ1以下」であれば、0以下が採用されると思います。

牛ゲーでは、
a - b \leq cという制約を「bからaへの重みcの有向辺」
とみなします。これに従って、3つの制約式から有効辺を追加し、B_0を始点とした最短経路問題を解きます。重みが非負なので、ダイクストラ法が適用できます。

あとは、1 \leq i \leq Nについて、

  • B_{i-1} \lt B_iならA_i \leftarrow 0、そうでなければ、A_i \leftarrow 1

としてAを構築できます。

提出コード