AtCoderで入青しました
はじめに
1ヶ月ほど前のABC328で色変し、青コーダーになりました。
水色になってから8ヶ月、ゼロからC++を学習し始めて2年弱で、様々なサービス&コミュニティのお世話になりつつ、ようやくここまで来られました。
この記事では、水から青になるまでの期間について、私が心掛けていた・やったことや、お世話になったサービス・コミュニティについて紹介していきます。
私のバックグラウンドとしては、次の3つが主な特徴だと思います。
社会人になってから競プロを始めた/業プロerではない
精進を(時短の面で)効率化するために様々なサービスを使ってきた
数学は比較的得意な方&アルゴリズムの知識は少ない方
青になるまでに心掛けたこと&やったこと
私は緑→水に時間がかかり、特にレート1100台に到達してから入水するまでに半年近くレートが伸び悩む時期がありました。その時期の反省を活かして、水色になる前後の時期から次の3つを心掛けて精進していました。
自分が本番で安定して通したい難易度帯の問題に定期的に触れる
コンテスト後に「通せそうで通せなかったあと1問」を入念に復習する
アルゴリズムの知識は貪欲に吸収する
これらを念頭に置き、次のように具体的な行動に落とし込みました。
本番で通したい難易度帯(水/青Diff)に定期的に触れる
レートを伸ばすために「7〜8問制のABCでコンスタントに5完、あわよくば6完」という状態に仕上げる必要があると感じたので、精進では水/青Diffを解くトレーニングを重点的にやりました。入青するまでの8ヶ月で、水Diffは約100問・青Diffは約50問解きました。具体的にはこんなことをやってました。
X(旧Twitter)で "#1日1水Diff" のハッシュタグで通した問題をシェア
→ 仕事と両立しつつ最大で20日以上続けることができ、自信が付きました。また、フォロワーさんが何人か真似してくれて励みになりました。Difficulty帯が固定で問題がランダムにピックアップされるバチャに参加
→あさかつ(毎朝7:30開始、1時間6問)・まよコン(平日21:00開始、100分8問)・もすーんバチャ(不定期、30分7問)に顔を出しました。参加できないときは、水青Diffの問題だけつまみ食いしていました。あさかつのDiscordサーバーで行われた8問ABCのEFG問埋めに参加
→E問題のほとんど&F問題の一部を埋めました。E問題のテイストに慣れたり、F問題に対して感じていた壁が薄れたりできました。kemunikuさん主催の毎日精進鯖に2度参加
→指定された2週間の間、自分のレーティングより高いDifficultyの問題を毎日1問以上通す&その日の24時までに通せなかったらBANされてしまうDiscordサーバー。やらざるを得ない状況に追い込まれたことで身が引き締まりました。
コンテストでの「通せなかったあと1問」を入念に復習する
コンテストで出会った問題は(おそらく目の前の一問に集中しているぶん)印象に残りやすいと感じていたので、通せそうで通せなかった問題の復習にも力点を置きました。加えて、実力を出し切れたかどうかを常に振り返るようにしていました(毎回何かしら反省点がありました……)。具体的には↓
通せなかった1問を #逃したACは大きい というハッシュタグでまとめる
数日以内にupsolve(最大30分考えて、だめなら解説ACしてました)
解けた問題も解説に目を通し、解法の要点を140文字くらいでまとめる
特に、コンテストや精進で出会った印象的な問題は、kyopro_friendsさんの解説ツイートやevimaさんの解説動画をお手本にしてポイントを言語化したものを脳内やメモ帳にストックし、次に類題を見かけたときに解法のポイントを自由自在に引き出せるように心掛けていました。前述のバチャで既にACしたことのある問題がピックアップされたときに、解法を思い出せるかどうかでテストしていました。
アルゴリズムの知識を貪欲に吸収する
日頃の業務ではプログラミングを使わないこと、勉強時間が取りづらい環境にいたので、入緑してから新しい概念をほとんど身につけておらず、知識面で後れをとっていました(どれくらい酷かったかと言うと、入水当時はダイクストラ法ですらソラで書けずブログからコードをコピペする有様でした……)。新しい知識を学ばねばと強く感じ、こんなことをやりました。
ryusukeさん主催の #限界アルゴリズム勉強会 に参加
→「こういうのが高度典型に分類されるんだろうなぁ〜」という内容(例:Mo's Algorithm)や、既に知っていたけど理解が深まる話(例:めぐる式二分探索の上端下端の決め方)など、いろんなことを学べました。アルゴリズムロジックやけんちょんさんのブログを時々読む
→入水するまでは、これらのブログで紹介されていたコード例をコピペ&改変して多くのD問題・E問題を解いていました。「知識が少ない分、知っているアルゴリズムは習熟度を高めよう」「原理を理解してソラで書けるアルゴリズムが増えたら応用も利くだろう」と考え、理解があやふやな部分を補う形で読むことが多かったです。
特に役に立ったサービス3選
kyopro_friendsさんのポスト
ABCの問題(C問題以降)を1問1ポスト形式で解説なさっています。コンテスト終了直後から投稿が始まるスピード感にいつも助けられています。また、
解けない&もう少し粘りたい問題があったとき、ヒント代わりに見る
精進やコンテストで解けた問題について「kyopro_friendsさんはどう解説するのかな?」とイメージし、実際のポストを見て答え合わせをしたり、違う視点を学んだりする
といった使い方も(勝手に)やっており、トレーニングに役立てています。
YouTubeチャンネル 「えびまラボ」
ABCの序盤6問を2〜3分という爆速で解説する動画や、基本的なアルゴリズムに関する10分程度の動画を上げてくださっているチャンネルです。既に書かせてもらった通りですが、コンテストやバチャの復習に役立てています。また、セグ木(BIT)を理解することができたのはこの動画のおかげです。evimaさん、改めていつもありがとうございます。
AtCoder Companions
AtCoder Replay の開発者でもある kakiraさんが昨年12月にリリースしたサービスで、自分と同じ間違え方をした提出が、どのようなコードの修正を経てACしたかが一目瞭然になる機能です。このサービス抜きに、仕事と両立しながら水Diff青Diffを定期的に通す精進は達成しえませんでした。これを紹介したくて本記事を執筆したといっても過言ではありません(小声)
特に「自分と同じ間違え方」の見つけ方が画期的だと思いました。AtCoderでペナした提出のリンクを貼り、どのテストケースで落ちてペナったかを配列(Result Vector)にすることで、AtCoderの膨大な提出たちから
「Result Vectorが一致した提出」≒「同じ間違え方をした提出」
とみなすアイデアは自分には思いつきませんでした。
これまでは自分だけで考えて行き詰まったり、X(旧Twitter)で質問してわざわざ強い人にコードを見てもらったりしていたのが、一気に効率的になりました。日々の精進を「1問30分で提出に漕ぎ着けられなかったら解説を読む、提出できてもACできなかったらAtCoder Companionsに投げる」というルーティンでやっていましたが、数え切れないほど自分のミスに気付かせてくれました。kakiraちゃん、ありがとう。感謝してもしきれません。
今後の抱負
黄色コーダーを目指したい
→ ひとまず入青から1年後の2024/10/28を期日に設定しています。ABCで6完を安定させたい
→ F問題埋め・青Diff埋めを引き続きやっていきたいです。ARCで安定したパフォーマンスを取りたい!
→ 6問ARCの序盤2問埋めに挑戦します。ARCなにかにお世話になります。AHCにも挑戦したい
まとめ
自分にとっては、通説(精進量の確保+コンテストの復習)は正義でした
加えて、学習&復習した内容をコンパクトにアウトプットするテンプレを持っていたのが大きかったです
AtCoder Companions はネ申です
最後までお読みいただきありがとうございました。