2019/06/30に開催された模擬国内予選にチームAobayama_dropoutで参加しました。 メンバーは変わらず碧黴さん・ゆきのんさん・僕です。
2018の参加記がないのは絶起して参加できなかったからです。
~コンテスト~
直前に問題の割り振りを決めました。碧黴さんとゆきのんさんでA~Cを解いている間に僕がD問題を読むことにします。
かなりわからなかったんですけど、rotate決め打つといつものDPになるので、これで解けた気になり、E問題を読み始めます。(本当はまだ解けていないです。) C問題を碧黴さんに誘われて一緒に考えます。斜め方向に移動する効率的な方法はないため、縦横の偶奇で場合分けをするとよさそうに見えます。 ゆきのんさんがBを通したので、先に実装が楽そうなCを書いてもらいます。サンプルが合ったので投げますが、WA。
僕は早くDが書きたくてたまらなかったので、デバッグ(反例探し)をぶん投げて実装に入ります。しかしサンプルが合わない。 rotateのコストが1のケースで、答えが1大きく出力されていたので、そこで壊れていることはわかりました。
Cをやっている碧黴さんにパソコンを代わって、しばらく考えていると、突然Cの場合分けが0 1で壊れることに気づきます。 それはWAを食らったテストケースに含まれていたので、そこを直して再度チャレンジするとACできました!Dを再開します。
rotateした後に文字を削除するとか、rotateする前に文字を挿入するとかで損していることが感じ取れたので、添え字を見ていずれrotateされる文字はあらかじめコストを少なくしておくことにすると、サンプルが合いました。 投げるとAC!早めに四完するのは譲れないラインだったので一安心です。
EとFを見比べると、どうにもFのほうがとっつきやすいように見えるので、そちらを考えます。 括弧のネストから上がってくるときに先頭と末尾を|Q|-1文字ずつ持っておくと、あとはすごく頑張れば解けそうということになり、僕が実装に入ります。 この時点で僕はこの解法が正しい可能性みたいなのをあまり信じていなかったので、しばらく実装方針を考えてボーッとしていました(は?)。この時点では残り2時間弱あったように思います。
ひとまず書き上げ、サンプルが通るようにしました。コンテスト時間は残り15分とかでした。 テストケースをダウンロードして実行していると、どうにも処理が終了しません。僕は一般に計算量がヤバいのだと思っていましたが、テストケースを見ると|Q|==1のときにずっと詰まっているようです。 これはおかしいということで、手元で単純なケースを作って試してみると、確かに|Q|==1のときに何かが起こっているようです。 どこがおかしいか見つけるより、|Q|==1のケースだけ別に対応するほうが楽そうだと碧黴さんに言われたので、そのような関数を生やします。これで実行が終わるようになったので、投げます。WA。
絶望しながらコードを眺めていると、おかしい点を1つ感じ取ったのですが、具体的にどこを修正すればいいか思いつかず、そのままコンテスト終了。 四完というのは譲れないラインであって、さらに一問解けることもなく去年と同じ完数に終わってしまったのはかなり残念でした。
~その後~
Fで最後に感じ取ったおかしい点を修正して、公開されたテストケースに通してみましたが、結局WAでした。やっぱり壊れてるじゃないか(憤怒)