ABC099

あ、ARCの番号を追い越しちゃったね。35分で全完して、残った1時間でブログを書くのがABC。

A - ABD

問題を読むのに時間がかかる。じっくり読んで名前の法則を理解(と思ったら、なぜ1998という半端な数なのかわかってなかった、000はないのね)。コーナーケースがサンプルにあることも確認。そこからはスムーズに書けた。まず"AB"を出力して次に"CD"[n >= 1000]を出力すればいい。サンプルが通ったので即提出。

B - Stone Monument

高さの差で場所がわかる。必ず2つの塔は埋まらず残っていることを問題文で確認。aとbの差がcとして、1からcまでまたはc-1までの和とaかbの和みたいなので解けることはわかった。あとはその中から正解を具体的に選び出さなければならない。適当に書いてサンプル、だいぶ合わないので、足すんじゃなくて引くのかと思い当たる(言われてみればそりゃそうだ)。引いたらサンプルが通ったので提出(200点なので理解してなくてもACがとれる)。
解いているうちに、塔の高さが1,2,3で左側の塔の高さの和を求めるみたいな気分になってた(難しい問題だとこういう根本的な勘違いを続けたまま考察を進めることよくある)。

C - Strange Bank

引き出せる金額に規則性があるが、こういう規則性は使わないことが多いんだよなあ。ということで思考停止DP。がっつり書くので思考停止とはいえそこそこの時間がかかる。なんか流れで配るDPにしたが、書く練習としてはよかったが、これ普通に(自分が書き慣れた)もらうDPで書けるじゃん。

D - Good Grid

この問題文は(時間をかけないと)読めない。じっくり読んでいく。問題文中にDを探すのに時間がかかった。Dの形からグラフを思い浮かべる。サイズは500の2乗で25万。けっこうでかい。%3とか出てきて難しそうだが、これもABCのDでたまにある「その性質が必要ない」やつだ。2段階に分けるのもABCに出そうな典型味がある。つまり、盤面を%3で3つに分け、それを各色にそれぞれ変えるコストを単純に計算(O(C*N^2))し、その結果を使って最適な組み合わせを全探索(O(C^3))する。25万なので30が掛かってもlogみたいなもんで大丈夫。最近のAtCoderはやや重めの制約があるけど、これが32msなので重くない。ジャッジが1年ちょっと前に速くなったことを反映しているのだ。Dのアクセスが局所的になるよう、2次元配列の添え字の順番を逆にした(30だから大したことないけど気分の問題、自分にとってはこっちのほうが美しいととっさに判断した)。
さて、このセットだと20分切りは無理。しかし25分くらいで解けて好調かと思いきや、サンプルが合わなかった。ていうか出力が0になっている。手前で出力させてどこで0になったか確かめていく。ずんずん遡って、なんかDの中身が0になってるっぽい。で、Dの中身を出力するとちゃんと入っている。矛盾。その間(入力とDを使うところの間)にバグがあるっぽい。まず疑うのは範囲外アクセス。しかし、そういうバグがあるようには見えない。なぜかd[h][p[i][j]]が0になっている。hとp[i][j]も同時に出力させてみたが、これも想定通りの値。なのに0になる。d[0][1]は1、hは0、p[i][j]は1、d[h][p[i][j]]は0。は????競プロやってるとたまにこのレベルの矛盾に出遭う。デバッグとは矛盾させる作業だが、ここまで見事に矛盾されると解消のしようがない。糸口が見えない。しばらく時間が経って、pがcharなのを思い出した。25万だからメモリを節約したのだ。intに直すとサンプルが通った。とにかく提出してAC。なるほど、デバッグ出力の1は、数値の1ではなく文字の'1'だったんだ。いや、デバッグ出力がおかしかったことはわかったが、内部的にはどこがおかしかったんだ?ああ、文字として入力を受け取っている。はー。このデバッグを10分で終わらせたのはすごいと思うよ。はー。ところで、cinやcoutで数値として振る舞う8bit整数は存在しないの?(それが存在しないはずがないという感覚がミスにつながった気がしてる)