人間だけど競プロやる

解けなかった問題を理解できたら記事を投稿します。日本語の解説が見つからなかったもの中心。

Codeforces Raif Round 1 (Div. 1 + Div. 2)

A. Box is Pull

ネズミの開始位置が任意なことに注意

B. Belted Rooms

ちゃんと紙に書きましょう問題
'>'が0、または'<'が0ならN個全部可能。
そうでないなら、連続する'-'の個数。
場合分けと円環上で連続するアイテムを数えられるか問題。

C. ABBB

ABを優先して消す。
解法。
答えをNで初期化する。Bの数を管理するカウンタを用意する。
逆向きにみていってBを見つけたらカウンタをインクリメント。
Aを見つけたら、答えを-2(ABが消える)して、Bのカウンタをデクリメント。
最後(先頭)までみたら、カウンタが偶数なら答えからカウンタ分を引く、奇数なら(カウンタ-1)を引く(BBを消す)。

D. Bouncing Boomerangs

条件をちゃんと詰めよう問題。
(x,y)を(row,column)とする。
まず任意のインデックスが0でないとき、(index,index)に優先してターゲットを置くことにすれば、グリッドをはみ出さず、横方向に重複しない(縦横にターゲットを3つ以上置くことは出来ない)。

条件を詰めると以下となる(fig.1,fig.2参照)

  • 「1」なら(index,index)に常に置くことができる
  • 「2」なら使っていない「1」のインデックスに置かれたターゲットをペアにできる。
  • 「3」なら使っていない「1」と「2」と「3」のインデックスに置かれたターゲットをペアにできる。
  • 「2」「3」でペアとなるターゲットがない場合不適。
f:id:bqn2:20201020142938p:plain
fig.1
f:id:bqn2:20201020143315p:plain
fig.2

解法

  • 右から決めていく。
  • ターゲットの座標を決定した「1」のインデックスをA、「2」と「3」のインデックスをBとする。
  • 「0」のとき。なにもしない。
  • 「1」のときターゲットを(index,index) としてAにindexを追加。
  • 「2」のとき、c =「A_0のターゲットのcolumn」 として、(index,c)。Bにindexを追加。AからA_0を削除。
  • 「3」のとき、(c,d) =(「B_0または A_0のターゲットのcolumn 」, ペアのインデックス) 、として、(index,index)、(d,index)。Bにindexを追加。AまたはBから選択したペアを削除。
  • 「2」「3」のとき、かつ|A|=0 \cap |B|=0なら、不適。

E. Carrots for Rabbits

無限にバグった。
先にだめな方針。「大きい値を2で割っていく」
この方針でサンプルが合っちゃうのが罠だった。方針がまずいことに気づかずWAを連発。
正しい方針。「ある人参をいくつに(等分に)分割するかを管理して、分割したとき減少量が大きいものから実施していく」。

だめな方針は分割数がたまたま一致すると答えがあってしまう。例えば、(8 \rightarrow 4,4 \rightarrow 4,2,2 \rightarrow 2,2,2,2) と(8 \rightarrow 4,4 \rightarrow 2,3,3 \rightarrow 2,2,2,2) 。
実装はpriorityqueueを使って、減少量を大きいものから優先してシミュレーションで間に合う。
「等分に分割」としているが、実際は整数しか認められないので余りをとって調整する。