horoyoisawaのゴミ箱

いろいろ書きます

問題を解いて終わりではなくEditorialまでちゃんとみよう。

この話は99%の自戒と1%の他人へのアドバイスである。

皆さん、競技プログラミングはしてるだろうか。僕は一応毎日少しながら問題を解いている。大体水色diffの中でも最も簡単な方の問題を解いている。問題が解けることもあるが解けないこともある。ところで、読者の方は問題が解けなかった時、解けた時、そのあとで何をしてるだろうか。

問題が解けなかったら解説をみるのは当たり前だろう。解説をみて納得して、理解した上で実装をしてWAをACにする。真面目にコンテストに取り組んでいるContestantにとっては当たり前のルーティーンだろう。

ただここで問題にしたいのは問題が解けた時にどうしているかということだ。

僕は「やったー、解けたー、次々ー」である。別の解法だったり、問題に別の設定を加えてみたりを全くしていない。自分でも「アホだな〜」とか「もったいないな〜」と思いつつ中々直っていないので、この解答後の態度を修正したい。

まず認識して欲しいことがあって、それはコンテストの問題は作問者の方がマジになって考え出した問題だということだ。作問者がターゲットでもレッドコーダーでもオレンジコーダーでもそれ以外の色でめちゃくちゃ強い人でもなんでもいいが、少なくとも多くのContestantにとって彼らは見習うべき存在だということだ。

彼らが作った問題ないし、Editorialに価値がないことがあるだろうか、いやない。それらは初心者の僕らにとっては掛け替えのない成長への一材料である。それらを活用しない手はない。

問題に際して、解けたとしてもどう解けたのかが重要である。なんちゃって解放で解けたのか、定石があるはずだけど知らず自力で考え出して解いたのか(これも重要なのだが)、必要条件を求めただけで十分条件であることを信じて(十分性を全く無視して)ACしたのか、その過程は人それぞれだ。

上のどれか一つにでも当てはまる人はEditorialを見た方がいいと思う。Editorialは少なく作問者の方が必要最小限の文章で簡潔に書かれている。初心者にとっては情報が少なすぎるかもしれないが、多くのContestantにとっては必要十分な量だ。それらを読んで

  • なんちゃって解放がどうして通ったのか
  • この問題は有名問題で定石が存在するのか
  • 十分条件であることの証明

などが分かることが多い。(まあ書かれていないこともあるが)

となると問題が解いた後にすることも自然と分かるはず。

  • なんちゃってではなく正当な解法でACする。
  • 定石通りのコードを真似して覚える。(初心者は特にこれ!
  • 十分条件の証明を丁寧に追ってみる(ノートに書いてみる)

もっと意欲があるならば、以下のようなこともできれば理想だ。

  • 問題の設定を変えてみて、その問題の解法を考えてみる。
  • コンテストで最上位陣のコードを眺めて、「早く解くための」最適解を探す。

せっかく作問者の方が色々考えて作った問題だ。味わい尽くさなくては本当に「もったいない」だろう。

僕が想定している(理想としている)コンテスト後の取り組み方はこの辺りだ。自分も未熟でできてない部分の方が多いが、これらを緻密に実行できるようにしたい。

最後に、

僕が競技プログラミングをやっていて何が一番いいかと言われたら、圧倒的に強い人が一体どんなことを考えていて、どんなコードを書いているかが情報として得られることだと答える。それらが無料で手に入るのだからこれほど美味しいことはない。

少なくとも、初心者が(僕はポスト初心者みたいな感じだが)成長するための材料は揃っていると思う。もしレートを上げようと努力している人がいたら頑張って欲しい。幸運を。

(時間がある人はAtCoder Liveとかみてみてもいいかもしれない。Snukeさん(劇強競プロer)がものすごく丁寧に解説しているので)