AtCoder 水色になるまで
はじめに
@unagiunagです。
先日のABC144で水色になることができたので(書くのが遅すぎてAGC044の結果も反映されています)、競技プログラミングをやっていく上で思ったことを適当に並べます。
勉強方法
基本的にはABC埋めと蟻本をやりながら、新しく出てきた知識などがあればそれについて調べて理解を深めるといった感じです。
精進の際の方針
- 30-40分考えて何も方針が思いつかない場合はeditorialや解説ブログをチラ見する。
- 解説をチラ見して解法が自分の中で理解できるなら、そこから10-20分くらいで考えをまとめて問題を解く。
- チラ見してもまとまらない場合はしっかりと解説を読み込んで問題を解く。
- 解説を読み込んでも理解できなければ諦める。
- 逆に、自力で良い感じの解法が思いついて、実装で詰まっている場合は解説などは一切見ずに自力で実装、デバッグする。
- 実装でどうしても詰まったら(1.5h-2hくらい)強い人の提出コードを見に行く。
- コードを見て写すのではなく、自分なりに実装する。
競技プログラミングは考察部分と実装部分に大きく分かれていると思っています。
考察部分は知らない知識があったり、類題を解いたことが無かったりする際に1から考察するのはコスパが悪く、ある程度考えて何も思いつかない場合にはすぐに解説を見て学んでいくことが大事だと思っています。
逆に、実装部分は自分の頭の中でまとめた解法をコードに落とし込む能力が大切で、これは自分の中で練習して高めていくものなので、人のコードを写経したりするのはあまり意味がないと考えています。(もちろん強い人のコードはまとまっていることが多く、コードの書き方という意味ではためになる部分も多いですが)
加えて、プログラミングする上で最も重要な能力はデバッグ力だと考えていて、これも繰り返し自分自身で考えてデバッグすることで身に着けていくしかないと思います。
解いた問題
水色時点での解いた問題はこのような感じです。基本的にはAtCoderの問題しか解いていないですが、水色までの段階で問題が不足することはまずないと思います。
様々なブログで無限回言及されている通り、初めはABC42以降を埋めていくのがおすすめです。
個人的なおすすめとしては、ABC126以降埋め > ABC42以降埋め > けんちょんさんのAtCoder版蟻本(初級編) > ABC42以前埋め(今ここです) > ARC-C や AGC-A,Bなど?。AtCoder版蟻本は難しい問題も多いのと、DP部分が非常に長くダレてきてしまうので、適当に飛ばしながらで良いと思います。
最近ではAtCoder ProblemsのDifficultyやRecommendations機能がとても優秀になっているので、Difficultyを見ながら解く問題を決めていけば良いと思います。
ライブラリ、スニペット
繰り返し使うアルゴリズム、データ構造などをライブラリやスニペットにすることはミスや労力減らすという意味で重要だと考えています。
ライブラリを書く際には、自分の中で理解した上で強い人のライブラリなどを参考にしながら書いています。 自分のライブラリ
参考にしているのは
- GitHub - beet-aizu/library: ライブラリ群
- Luzhiled’s memo | C++による競技プログラミングのライブラリです
- GitHub - yosupo06/Algorithm: プログラミングコンテスト用のライブラリ
- Spaghetti Source - 各種アルゴリズムの C++ による実装
スニペットは競技プログラミングで使うようなコードの断片をショートカットで呼び出せるようにしていて非常に便利です。
モチベーションの保ち方
これは私が競技プログラミングを続けていくために意識していることです。一個人の考え方なので参考になるかはわかりません。
コンテストに出る
これは基本にして最も重要なことだと思います。コンテストに出ないとレートが上がることはないのはもちろんですが、定期的に精進の成果を見るという点でもコンテストに出続けることは大事です。
また、コンテスト中は追い込まれているので普段よりも必死に考察するし、よく身に付くと個人的には思っています。
AGCで何度も破滅を経験しましたし、緑色の中位~上位で停滞してた頃はコンテストに参加するのが辛かったですが、めげずに参加できるコンテストにはできる限り出ています。
自分と同じくらいのレベルの人と競い合う
私はそもそもサークルの友人に誘われて競技プログラミングを初めたのですが、その時点でサークルで水色の人が3人いて、追いつくことを目標に頑張っていました。今では、青色1人、水色3人、緑色1人のslackグループで、コンテスト前後や競プロに関係する話題があった時など色々とコミュニケーションをとっています。最近水色以上の他の人はサボり気味なので、今のうちに追い抜きたいです笑。
人に競技プログラミングを布教する
私の影響で競技プログラミングを始めた人が何人かいるのですが、その人たちのレートが上がっていくのを見ると嬉しいですし、自分も頑張らなきゃなという気持ちになれます。また、他の人にわかるようにかみ砕いて説明することは自分の理解を深めることにもつながり、勉強になっています。
AtCoder ProblemsのStreakを伸ばす
毎日少しでも競プロをやる習慣をつけるという点ではこれに勝る方法はないと思います。忙しい日は100点でも200点でも良いのでとりあえずやるくらいの気持ちで、負担にならない程度に続けていくことが大事だと思っています。
まとめ
いろいろ並べましたが、一番は競技プログラミングを楽しむことが大切かなと思います。苦労して考察して問題が解けたときは爽快感がありますし、知らないアルゴリズムの知識を問題を解きながら学ぶことができるのはワクワクします。ゲーム感覚で楽しむことができているからこそ、続けられているのかなあという気がしています。
とりあえず初めの目標である水色は達成したので、青色に向けしっかりと精進していきたいです!