Codeforces Round 1109 (Div. 3) 参加記

私です。

Codeforces Round 1109 (Div. 3) に参加しました。4完です。D問題よりC問題の方が難しかったです。 1時にパソコンが使えなくなるという制約があるので、大体フルで参加できなくて悲しいですね。

ちなみに、今回も itertools のコメントアウトを忘れました。確認したんだけどなぁ…


A問題 Iskander and Drawings

もっと賢い方法がありそうですが、私は ランレングス圧縮 で解きました。


B問題 Nikita and Books

結構悩みました。具体的な方法を考えるより、理論上可能かどうかで判定するとうまくいきました。

  1. AA の累積和配列 PAP_A を作成します。
  2. 配列 B=[1,2,,n]B = [1, 2, \ldots, n] の累積和配列 PBP_B を作成します。
  3. PA[i]PB[i]  (i,1in)P_A[i] \ge P_B[i] \; (\forall i, 1 \le i \le n) を満たすか否かで Yes/No

簡単な証明のようなものを書きますが、

作りたい配列 PP の一番簡単な形は P[i]=i  (i)P[i] = i \; (\forall i) です。なので、それを作れるか否かを判定するだけで良いと思います。(多分あってます)


C問題 Stepan and Permutation

個人的にこの問題が一番難しかったです。類題を挙げるならば、Codeforces 1103 - B になるのでしょうか。 いや、問題を確認してみると全然違うかも。

まぁ考え方は似てるので許してください。

まず、GCD(x,y)1GCD(x, y) \ne 1 のケースを考えてみましょう。

  1. g=GCD(x,y)g = GCD(x, y) とする
  2. P[i]imodg  (i)P[i] \equiv i \mod{g} \; (\forall i) を満たすか否かで Yes/No

となります。

次に、GCD(x,y)=1GCD(x, y) = 1 のケースです。

x,yx, y が互いに素なので、modmod を変えることができます。 しかし、自由に変えられるのかを考える必要があります。未証明なのですが、x+ynx + y \le n なら変えられるような気がします。 そして、それは制約で満たされています。

これらの考え方で解くことができます。


D問題 Yaroslav and Productivity

ここ3週間ぐらいどこかのコンテストで出ている気がしますね。そうです。クエリ逆読み です。

  1. AA の累積和配列 PAP_A を作成する。

  2. BB を昇順ソートする。

  3. BB の先頭に 00 を追加し、BB の後ろから (Bi1,Bi)(B_{i-1}, B_i) で取り出して以下の操作を繰り返します。

    • PA[Bi]PA[Bi1]|P_A[B_i] - P_A[B_{i-1}]| を足す。
  4. 最後に PA[n]PA[Bm]P_A[n] - P_A[B_m] を足します。

イメージ的に ABC466 - E に似ている気もしますが、こちらは制約的にDPは不可能です。

ある範囲の値全部の符号を反転させると、その範囲における総和の符号が反転します。なので、範囲の総和を累積和で管理します。

後ろから見ていくことで、そこまでに見た範囲の値を確定することができます。なので、ある範囲に対して、貪欲に大きい方を取れば良いです。


ここでタイムアップなので、E問題以降は解けませんでした。

最初にも書いたのですが、今回は 本当に ちゃんと itertools のコメントアウトを確認したのですが、相変わらずこれでペナをつけるのはもったいないなぁと…

Codeforces用の環境を作成するべきなんでしょうか。うーん…

それでは、また。