「rng_58がおすすめする練習の仕方」シリーズでは、AtCoderでadminを務めていたrng_58(りんごさん)のおすすめする様々な練習方法をお伝えします。
このシリーズでおすすめする方法は、すべてのユーザに適用できるものではない可能性があります。あくまで一例として参考にしてください。
このページは、黄/橙向けです。
概要
AtCoder では、問題やコンテストを大きく2種類に分けて管理しています。
Aタイプ : 基礎力を身につけるための例題形式
Aタイプは、教科書の例題のような問題をコンテスト形式で提供するものです。例題を読み、必要に応じて解説にも目を通し、その解法を理解することを通して、基礎的な力を身につけることを目的としています。上位陣はコンテスト中に新たに考えることはなく、過去に見た類題の経験から解いています。
このAタイプの問題は主に AtCoder Beginner Contest (ABC) に相当します。
Bタイプ : 新しいアイディアを要する競技目的の問題
Bタイプは、新しいアイディアが必要となるオリジナル問題を出題するコンテストです。コンテスト中に自ら解法を考察し、解いていくことを目的としています。上位陣であってもこの点は変わらず、コンテスト中に考察して解いています。
このBタイプは AtCoder Regular Contest (ARC) や AtCoder Grand Contest (AGC) に該当します(ARC と AGC の違いについては難易度などが関係しますが、ここでは割愛します)。
Bタイプは基本的にAタイプよりもハイレベルで、Bタイプの問題を解くためにはAタイプの問題に分解し、それぞれを解ける必要があります。そのため、ある程度Aタイプの問題が解けるようになるまでは、Bタイプへの挑戦はおすすめしていませんでした。
目安として、レーティング2000に到達したあたりからBタイプに取り組み始めるのが適切です。このレベルになると、コンテスト中に自力で解法を考え、問題を解く力が徐々についてきます。高校数学でいえば、教科書を一通り終えて、数学オリンピックの問題に挑戦し始める段階に相当します。
黄〜橙(レート2000〜2799程度)の方には ARC の参加を推奨します。AGC への参加も問題ありません。また、海外のコンテストに参加することも推奨しています(詳細は後述します)。
ただし、Aタイプをしっかりやり込むことで、赤色(レート2800以上)になることも十分可能です。しかしこれは、たとえば、トップレベルの参加者(touristほどではないが、海外オンサイト常連レベル)が「悩まず解けた」と言っている問題をすべて解き、少しでも詰まった問題は潔く諦める、という方針でも赤に到達できるという意味です。
そのため、黄〜橙レベルではまだAタイプの基礎トレーニングが十分ではないと考え、引き続き ABC に参加することをおすすめします(詳細は後述します)。
扱う題材
- ABC
- トップレベルの人と同等のスピード、精度で詰まらず解けるレベル帯の問題は飛ばして構いません。黄色下位の人は最初の4-5問がそれに相当するはずです。
- 上限はなく、一部のマニアックな現代テクニックの Ex を除いて全部解きましょう。
- ARC / AGC
- A 問題からすべて。上限は自分のレート+400〜800程度の diff までが目安です(好みに応じて調整してください)。
- Codeforces Div1
- 高校生ならIOI(情報オリンピック)
- 可能ならIMO(数学オリンピック)も出ておくとよいでしょう。
- 大学生ならICPC
解き方
ARC / AGC / Codeforces Div1 などコンテストに参加する場合
なるべくコンテストに参加しましょう。コンテスト中に本気で考察する経験は貴重です。 コンテスト後に行うことは以下の通りです。同じコンテストに参加した自分と同格〜格上の集団で取り組むとよいでしょう。
問題ごとに以下に分類します。
- 楽に通せた問題
- 特に対応なし
- 苦労して通した問題
- 未証明のまま通した場合は証明しましょう。できなければ解説やグループの助けを借りて不明点がなくなるまで理解してください。より楽な解法がないか検討し、あれば理解し直してください。必要であれば上位陣のソースコードを読み、楽な解法があった場合、同様にその解法も理解しましょう。
- 通せなかったが手が届きそうな問題
- 時間が足りなかったなら改めて挑戦し、解けたら(2)へ。しっかり考えた上で解けなければ解説を読みましょう。また、解法に至る考察過程を集団に聞いて学びましょう。Bタイプの問題では考察過程が重要です。その後実装してACし、(2)へ移行しましょう。
- 難しすぎる問題
- 強くなるまで保留し、実力がついてから過去問として扱いましょう。
ARC / AGC / Codeforces Div1 過去問を解く場合
基本的には上記と同様の手順を踏みます。コンテストに参加する経験は貴重なので、新しい問題は出来る限り本番に参加して解くことをおすすめします。
都合の合う人がいれば、バーチャルなどを利用し競技形式でやるのもおすすめです。
IOI / ICPC
年齢制限がありますが、それさえ満たしていれば国際大会に参加できる貴重な機会です。
参加を通じて知り合いも増え、前述の集団も見つけやすくなります。
ABC
必ずしもコンテストに参加する必要はありません。
準備運動や、後半の問題に抜けているテクニックがないかを確認するために活用します。フロー、セグメントツリーなど、このレベル帯で出てくる新テクニックも多少あります。
基本的には以前と同じです。解説はすぐ見て構いません。スピードと精度をあげることを徹底し、本番中の最速タイムと同じレベルを目指しましょう。
どのぐらいの diff が解ければよいか
練習する上でやっていくべき diff は上述したとおり、自分のレート +400〜800 程度の diff までが目安です。
diff の定義上、コンテスト中は自分のレート付近の diff の問題の正答率が約 5 割になるのが自然です。
問題を解くリズム
解き方を参考にしてください。
解説を見るタイミング
解き方を参考にしてください。
必要とされる知識
ABC ではこのレベルであっても一通り必要な知識をカバーすることを目指しているので、これまでに記載した問題への取り組み方をしていれば知識は揃うはずです。
レーティングが上がってくると、考察力が本質になってきます。
高度な知識を持っていることより、基本知識を使いこなすことのほうがはるかに重要です。
新しく必要とされる知識は多くありません。