ABC241

5完。めちゃくちゃつまらなかった。CDEFが、解けそうなのはすぐわかるが細かい考察や実装でめちゃくちゃ時間かかるやつで、順番に解いたのでGを読むことができなかった。最近のABCは面白いことが多かったから油断していた。やっぱABCは勉強用でしかなくて、エンターテインメントとしては考えられてないんだろうなあ。AtCoderにおいて青以下は楽しませてもらえず、黄色になるまで勉強してくださいとしか言われないのだと思う。この先の人生もこんな感じなんだろうなというイメージの象徴となるようなつまらなさだった(力不足により、難しくて面白いことはやらせてもらえない)。

A - Digit Machine

やるだけとはいえ、問題文を読むのがかなり難しい。こういう高度な概念はEとかで出てくるイメージ。

B - Pasta

unordered_mapで本数を管理。

C - Connect 6

転置すれば縦横のうち横だけ見ればよくなる。左右反転すれば右下へ向かうななめだけ見ればよくなる。ななめのスタート地点が上辺か左辺か2種類あるのが厄介だと思ったが、転置でそこもカバーできている。横はまあいいとして、プラスしてななめの実装も入るのが嫌すぎる。間違えそうな箇所は多いのにサンプルが弱い。やりたくない。18分かけてAC。運が良かったと思った。

(解説を見て)あー単純にスタート地点全探索か。変数の使い方といい、本当に能力が低い。プログラミングの才能がないのでABCのCでお断りされた。

D - Sequence Query

multisetを使うだけと思ったら、向きが2種類ある。2種類の実装をしないといけない。その違いが見れるのは楽しみでもあるが。multisetのupper_boundとlower_boundを使う。3種類目のクエリが、イテレータをインクリメントする回数と終端か確認する回数が違っていて大変だった。答えを入れる変数がintで1WA。これが仕方ないと思えるほどの重実装。間違えてABCじゃなくてAHCの問題出しちゃったのかなと思った。

E - Putting Candies

しばらく制約の意図がわからず、シミュレーションしようとしてできないことに気づいた。皿のアメの個数がmod Nで同じになるとそこからの増え方も同じになる。よってループ検出するいつものだが、これもひたすら面倒なだけで時間はがっつりかかる虚無。N通りの場所について、何回目に訪れたかとそのときのアメの個数を記録していく。2回目の場所に降り立ったら、その場所でのアメの処理をする前同士の差をとり、残り回数をループ長で割って切り捨てたやつを求める。アメの個数がmod Nはループを何周しても変わらない。ループできるぶん進めてまた愚直に戻る。

(解説を見て)ループの前の半端と後の半端をまとめて処理している。解説のソースをかなり長時間にらんだりいじったりしてようやくわかった。こういう世界が見えているのか。ダブリングも、思いついてはいたが、こんなに短く書けるとは思わなかった。

F - Skate

BFSでできそう。外側から書いていって、最後に、ある座標(障害物の隣やスタート地点)から4方向に有向辺を張る処理を書く。unordered_mapで座標と頂点番号を対応付ける方針だったが、頂点番号の追加でかなり悩んでしまった。最終的には、座標を与えると(必要なら新たに生成して)頂点番号を返す関数を作った(この構成が全然見えないんだからなあ)。スケート場の内部であり、障害物の内部でないものだけ処理する。unordered_mapで縦位置にsetを対応させ横位置を入れておく(最初から見えていたやり方だが実装は最後になった)。障害物の内部ではないので、次の障害物と前の障害物をチェックし存在すればその手前へ辺を張る。同様のことを縦横逆にしてもやる。

書き上がったのが終了17秒後でサンプル通らず、コピーした反対向きの処理の変数を1個直し漏れていたのが原因だった。ACするには40分程度必要だったということだが、まあそんなもんだろう。ここまで、時間のかかる問題ばかりだったので間に合わないのは順当。ただ、間に合っていてもレーティングは下がっていた。当たり前だけどこれは苦手セット。