ARC132

3完。コンテスト前は全然緊張感とかドキドキしたりとかがなかった。しかしウンコはしっかり下痢で出た(いつも通りARCが下剤として働いていた)。始まると、解けそうになったときや提出するときなどにドキドキした。すごく集中して考えるという感じではなかったが、淡々と考えることができて、これはこれでよい。順位という意味では相性が悪いセットだったが、自分の力を十全に発揮できたという意味ではよかった。結果的にかなり嫌な気分にはなった。

A - Permutation Grid

実際に構成してみようとする。n=5として5のところは決まる。そこから決まらないなあと思っていた(1の行は5の列以外全部白に決まることに気づいてなかった)けど、その雰囲気からRもCも1,2,3,4,5のケースを感じ取り、階段みたいになる(一意らしいから他を考える必要はない)からそれをスワップするだけっぽいことに気づいた。階段では足してnを超えたら黒みたいなのでそう書く。

B - Shift and Reverse

反転させても結局rotateしかできない(rotateに左右はない(というと変か、左rotateをn-1回すれば右rotate1回の代わりになる))。並び替えできない入力は与えられないので、まず反転してるかを最初の2個で判定(mod nで+1になってるか)。結局それで場合分けした。反転してたら、戻す前にrotateするか後にするかの2択でそのminをとればいい。そうでないとき、rotateだけするか、2回のreverseではさむかの2択。

証明はしていなかった。解説の解法Bが明快。

(追記)こういうの早解きできないんだよな。そこまで難しいと思った瞬間はないんだけど、一生外堀埋めてたからなあ。コンテスト中は当然初見の問題だから、埋めずに突っ込むのはさすがに無理。

C - Almost Sorted

しばらくながめるが、解けそうにない。箱根駅伝DPでググって図を見ながら考える。1,2,3,4,5を縦に書いたのを左右に並べて、線で結ぶ。3と2を結んだら、順列の3番目に2が入ることを表す。計算量が心配だったが、dが小さいので全パターン持ってもDPテーブルのサイズはO(n*2^(2*d))で済む。最初のi個について最初のi個の範囲内の線だけを全部書いたものを考える。順列が作れるとすると空きはd個前までにしかないので、そこをbitで(左右合わせて最大10個)。これでDPできそうだが、遷移をきれいに書けなかった。配るDPにした。できないことが確定するやつ、aの情報に反するやつ、空いてないとこと線を結ぶやつ、などを除く。

実装にも時間がかかったし、細かいミスをたくさんしてその全てを潰してサンプルが合うまでにかなりの時間がかかった。ACまでに1時間かかっている。慣れてないDPはちゃんと考えないといけないから時間がかかる。コンテスト中にかかっていい時間じゃない。といってCを捨ててDへ行くには時間をかけすぎているしCが解けそうになっている。この立ち回りは仕方ないと思う。ただ結果的にARC中ゴミのような時間を過ごし、自分としては苦手なDPを書き切ってすごかったのに順位は悪く、相当嫌な気分になっている。生きるのがしんどい。

D - Between Two Binary Strings

「美しさ」について調べると、同じ文字が連続している連結成分の個数を文字列の長さから引いたものになっている。スワップは1の移動としてよい。sとtで同じj番目に出てくる1同士を対応させて、その間をわりと好きに動けそう。1を重ねてはいけないのが厄介そう。端が怖いので、どっちかの文字しかないケースは場合分けしておく(ちゃんと書けば必要ないんだろうけど)。とりあえず左端から貪欲に詰めて損しない気がする。連結できなくなったら、逆にできるだけ右へ置く。左右反転してもう1回やる。1を壁に付けないのが最善のケースもありそうなので、最初のをできるだけ右に置くのも試す。連結成分の個数がかなりややこしいが、基本(直前の0と新しい1で)2増えて、左端は1で始まっても1増えて右端は0で終わったら1増える感じにした。これで(コンテスト終了後に)AC。感覚的には反例なさそう。証明はできそうにない。AC取るだけならできても、実際はかなり難しそう。