新人競プロerの山田です。
ABCDF5完、503位、perf1898、rate変動999→1142でした。
A問題 B問題
はい。(ここまで5分22秒0ペナ)
C問題
順列全探索しか思いつかないが、順列全探索にしてはn≦10という制約がそこまで小さくない。10!をグーグルに計算させたところ300万ぐらいだったので行けるか……?と思いながらnext_permutation使って実装。結果1748ms(制約2sec)で通った。あぶねえええええええ。
Pythonでやってたら通ってなかったと思うとなんかズルした感もある。しかし言語間の有利不利も含めて競技なんだと割り切った。そうしないとこのあと焦る。ここまでで24分56秒0ペナ。(所要時間19分。結構かかってるな。何に時間取られたか覚えていない。日記はコンテスト当日に書くべきか)
コンテスト終了後にツイッターで見かけたが、Pythonで通した人は200人に満たないらしい。そこまで攻めた制約にすることあるか。
D問題
〇〇番目の回文数はなんですか問題。丁寧に実装しなければ自爆すると思って、コメントを多めにつけながらAC。ここまでで48分53秒0ペナ。(所要時間24分。デバッグに時間がかかった)
350点問題にしてはかなり時間がかかった。ここまで丁寧にやるのが正解だと思った。
E問題
島水没問題。5分ぐらい考えたがわからなかった。飛ばしてF問題を見た(点数差が50点しかないので、そこまで難易度差がないと思った)。
解答見てもここでどうやってpriority_queueを思いつくのか不明。
F問題
回文で数式を書け問題。
これに手を付けたのが勝利の始まり。
解法はすぐに浮かんだ。nの約数とそれを逆さ読みした数を、割れるときに割っていって、回文数が出てきたら数式を作れる。作れなかったら戻って別の逆さ読み約数で割れるものを探す、というのを再帰関数を書くという解法(説明むず)。しかし計算量がよくわからない。
この解法でやるなら再帰関数を書かなければならない。再帰関数の書き方に慣れていなくて時間がかかってE問題を落としたこともある(ABC357)が、当時よりは成長していたらしく実装できた。
サンプルが合わなかった。けれどすぐに「出力にゼロを含んではいけない」ことをに気づき修正。
サンプルが全部合った。けれど計算量が全くわからないし、ここから計算量を落とす方法はいくつか浮かぶが、残り時間が少なすぎるので投げた。
22:33:18 AC(0ペナ)。ちなみにC問題と同じく実行時間は超ギリギリ。
ここで順位表を見たら山田は500位でガッツポーズ。ABCDE5完のすべての人より上なのが強すぎる。
コンテスト終了
競プロにおけるC++の有利さを実感した回。史上最高perfでしたがもし山田がPython勢だったら3完しかできていなかった可能性が高いです。
それにしても今回は強運でした。もしE問題の解法が普通に浮かび、飛ばしていなければいつも通り水色perfでした。F問題の相性もたまたま良かったです。
これからF問題を解ける確率があがっていけば、Eを先に解くかFを先に解くかという駆け引きが重要になっていきそうです。