Rustコトハジメ

プログラミング言語Rustと競プロに関する情報をお届けします。

これからの勉強方針を考えよう

今現在、AtCoderのレートが970で、たぶんぼちぼちやっていれば水色までは行くだろうなという見込みは立ってきた。

今の目標は、最終目標である青の実力をつけることなのだが、ここにはかなり乖離がある。青に行くためには1600を出せばよいということではなく、最低でも1800、出来れば2000を出す必要がある。このくらいの実力があると、ある程度安心して青に行ける。

そのためには、700点くらいまでの問題と対峙する必要がある。こうなるとAGCでも2完3完を狙えるレベルになり、参加する意義も出てくる。今はAGCは単なるギャンブルだが、こうなってくると楽しさも増すだろう。

しかし、500-700点と400点は全く異質で、難易度が桁違いに上がる。実際に、500点の段階で、正答者はかなり少なくなってくる。400点までは訓練次第では誰でも解ける。ここまでを早解きすれば水色にはなれる。しかしそれ以上にはなれない。今、上に行けるかどうかが試されている。

500-700点はプログラミングの問題というよりは、数式で最後まで引っ張って、それはプログラミングで解けますという問題が多く、数学とかグラフ理論の問題という毛色の違いがあり、その考察の部分で死んでしまうことが多い。

こういうタイプの問題はどうやって勉強したらよいのか。もはや、プログラミングスキルの問題ではない。そもそも解法を読んでも理解に苦しむということすらあり、読めば実装はそう難しくないというケースが多い。

上位陣もおそらく、試行錯誤はしている。解法探索と呼ばれるものだ。しかしその粒度が違う。上位陣はたぶん、過去の解法のエッセンスのデータベースから、今の問題に役立つかどうかのパターンマッチをしている。だから、おれが何十分もかかる500点問題に対して解法が瞬見えして、実装時間だけで提出してくる。知能のレベルで、おれと彼らの間にそこまでの差があるとは思えないから、差はやはり知識の差だと思う。

一方でおれは、問題そのものに対して裸一貫で立ち向かっている。理想的には、上位陣のように解く方が速いし正確となる。おれがより簡単な問題に対してはそうしている。例えば、これは累積和を計算しておけば計算量を減らせるぞとか。しかし難しい問題になると何の知識も引き出せなくなり、裸一貫で特攻するしかなくなってしまう。

従って、解法のエッセンスを増やすということがこれからすべきなのではないかと思っている。

以前に500点を埋めるという目的でひたすら自分の頭で考えて解くという苦行をしたのだが、自力正答率はよく見積もって4割で、わからない場合にはひたすら何時間も考えて結局わからないというケースがあった。結果一日に解ける問題数も限られてくるし、結局じっくり考えただけ自分の身になるものでもないように感じた。ただ疲れただけに終わり、記憶もあまり残らなかった。

長い時間一つのことを考えるということは重要な訓練だとは思う。だから、競プロでも、自分の頭で考えることを強調する人がいる。しかし、ただ長く考える訓練という意味ではおれは過去の経験で色々としているわけだし、今さら競プロでやったから何か自分の力になるというものでもないからこの意味で無駄があるように感じる。

例えば問題を読み、10分か15分だけ考えて、とにかくその時点でわかるわからないに限らず解法を見てしまう。それで、時間が経ってからノーヒントでACしにいくという形でも、解法のエッセンスが自分の身になったかどうかがわかるしよい復習になるから学習の効率という意味では高いのではなかろうかと思っている。

しばらくこの方式で700点まで埋めてみようと思う。そこでやはり何の身にもならん、自力で解くべきだということであれば、また考え直す。時間的には効率良くやってるのだから、間違っていたとしてもそこまで損もない。

あとはより根本的には、こういった参考書をもう一度、競プロの視点を持ってやってみるというのもありかなとは思う。

マスター・オブ・整数―大学への数学

マスター・オブ・整数―大学への数学

マスター・オブ・場合の数―大学への数学 (分野別重点シリーズ (2))

マスター・オブ・場合の数―大学への数学 (分野別重点シリーズ (2))