時間が取れない私が、効率的にやろうと考えて取り組んでいる勉強法をまとめておきます。
自分の実力を常に数値化する
AtCoderを初めてやるとき
まず自分の現時点での実力を把握することにしました。過去問を数回やって解ける問題だけACし、システムに慣れて、実力ではないところでパフォーマンスが落ちないようにしました。それから数回ABCに参加して(レートは最初のうちは補正がかかるので)パフォーマンス値を出し、自分の実力を掴みました。
コンテストはできるだけリアルタイムで出る
レートやパフォーマンスを見て実力を測りたいので、特にABCはできるだけリアルタイムで出るようにしています。
実力を測ることが目的なので、コンテスト中に分からない問題の解き方を調べることはしていません。思考力・実装力のトレーニングも兼ねて、分からなくてもひたすら考え、TLEっぽい解法しか思いつかなくても正解が出そうならTLEを出すまで書いています。
勉強法
ひとつのアルゴリズムを集中して学ぶ
他のアルゴリズムに浮気せずひとつに集中して勉強し、自分で組めるようになるまで類題をひたすらやっています。コンテストで自分が取り組むべき点数帯(下記)の中で解けなかった頻度が高いアルゴリズムから手をつけています。練習問題はこういうまとめサイトを参考にしています。
過去問は点数帯を絞って取り組む
時間がないので全埋めとかはできません。というか、上記のアルゴリズム勉強を優先しているので、ただ過去問をやる時間というのはほとんどありません。やるときには、chokudai氏のツイートを参考に、取り組むべき点数帯を決めます。AtCoderを始めた2019年7月時点で自分は水色くらいだと認識したので、ABCのA, Bはやる意味がないと判断し、C(抜け漏れ確認のため), D, Eのみに取り組みます。
計算量を考えてから書く
自分の書くアルゴリズムがTLEにならないかどうかは書き始める前に判断できるようになりたいと思っているので、考えてから書くようにしています。2019年7月時点では自分の見積もりにぜんぜん確信を持てていませんが、少しずつ向上していくつもりです。
コンテストで解けなかった問題は、終了後にすぐ解く
問題の内容を忘れないうちに解説や最速コードを読んで理解し、自分で解いておきます。自分の分を超える点数帯の問題は割り切ってスルーしています。
解けた問題でも、最短実行時間の人の解答を読んで理解する
自力で解けた問題でも、よりエレガントな解答を出した人がいる場合がありますので、毎回確認するようにしています。
同じ問題+同じ言語+ACで検索し、実行時間でソートして、最短の人のコードを読みます。競プロ特化コード(マクロだらけ)とか変数名の命名規則が自分と違いすぎて読みにくい、とかはサッとスルーして、簡潔に書いている人を選びます。
読んで理解したら、お手本のコードは見ないようにして、自分の理解だけをもとにコーディングしてみます。ACが出れば完了です。
最適なアルゴリズムがわからなくても解けそうなら解いてみる
知っている知識を組み合わせて通す力も重要だと思っています。ただし、計算量を考えてTLEっぽいなと思ったら諦めます。
方針さえ見えない過去問は10分くらい考えたら諦めて調べる
アルゴリズムを知らなければ手もつけられない問題は往々にしてあります。数学的知識が必要なものとか。解説を読むと使うアルゴリズムの名前が載っていますので、それを手掛かりに調べます。