112. AtCoder参加記録(AtCoder Regular Contest 140)
19回参加でレート 1131 です。
今回はパフォーマンス 1681 です。初めての青パフォ!
ABCを通して、DEFは未解答です。3ペナですが、十分すぎる成果。
各問題の感想など。
A
16分6秒(Bから戻ってきた後の所要時間)。
まず、 はどのように求められるか考えました。入力例を見ると、自然数 を小さい方から見て、先頭から 文字のループで文字列が構成される場合 となるみたいです。 なので、 で 文字ループが作れるか、作るとしたら何文字変換すればよいか、を見れば で行けそう…と考えました。実際には は の約数だけ見れば良いのでもっと余裕があります。
文字の変換は、ループさせる文字列の 文字目()で最も多く使われている文字を採用して、それ以外を変換すればよいです。変換する文字の合計数が 以下ならOK、そのときの が答えです。
この辺りまで5分ほどで薄っすら思い浮かびましたが、ちょっと確信を持てなかったのと実装が明らかに重かったので、頭の整理がつくまで一旦パスしてBを見ました(えらい)。
B
41分04秒(Aの考察時間を含む)。
変換後に ARC が新たにできるかが焦点です。偶数回目の操作 ARC → AC ではどうやってもできません。奇数回目の操作 ARC → R では、AARCC のようなパターンでできます。よって、正規表現で書くと (A+)ARC(C+) のようなパターンがあれば奇数回目の操作で変換「したい」です(注意すべきは、必ずできるとは限らない点です)。
ある ARC から新たな ARC を作れる回数は、前後のAとCの連続数のうち小さい方です。各 ARC についてこの数をカウントしておき、この数が 0 である ARC は別にカウントします。前者は奇数回目で優先的に選択し、後者は偶数回目で優先的に選択します。偶数回目で後者がない場合、仕方がないので前者を選択します。
結局、このような ARC の個数の計算に 掛かり、あとは変換をシミュレートするだけなので、大きく見積もっても です。
これも実装が重いですが、Aよりは楽そうだったのでこちらから片付けました。実装ミスで1ペナ。
C
51分52秒。
ABが解けた時点でだいぶ安堵して、かなりリラックスしながら「解ければラッキー」くらいの気持ちで解いていました。
なるべく真ん中の値から初めて、小さい方・大きい方…のようにジグザグ取っていけば良さそう?と直感。たとえば、 なら、2文字目は真ん中の値にして のような形です。これでジグザグに取れなくなったら、余ったものを適当に後ろへくっつけます。
あんまり確信は無かったですが、正直これ以外思いつかなかったのでその通りに実装。小さい方・大きい方どちらから優先的に取るか、 が偶数のときの「真ん中」の取り方、で 通り試して、 くらいの実装にしました。この場合分けのアイデアは、昨日の ABC E問題の教訓でもあります。
WA が出るたびに運良く通らないパターンが見つかり、実装を修正できました。3回目の提出で半分ほど通った時点で WA が出ず、「これは…!」と思いました。めっちゃ心臓バクバク言ってました。
D, E, F
見てないです。
前回のARCは惨敗でしたが、今回はかなり上手く行きました!青パフォ出せたのがとても嬉しいです。正直、ARCは運ゲーみたいなところがありますが、たまに大当たりを引くと最高の気分になりますね。誰かがパチンコって言ってたな…。
今日も音楽を聞きながらのんびりやってましたが、やっぱり自分はこっちのスタイルが良さげなので続けていきます。