入緑から4ヶ月半、AtCoderを始めて9ヶ月半。2025/01/11 開催の AtCoder Beginner Contest 388 でレートが 1000 を越えて緑の瓦が 3 枚になりました。色変は難しいでしょうから今回は瓦変で記事を書きます。刻みます。入緑記事はこちら。https://qiita.com/omakasessan/items/51af39959ba0b54ac0af
前回からやったこと
ABC200番台の C, D, E 問題を解いています。前と同じように 250 から 300 、その後は 249 から下に降りていってます。現在 226 まで終わりました。
見ればわかりますがE問題はだいぶ歯抜けになっています。解説を読んでもなお解けない問題が多すぎるのが原因です。CとDは前回述べたようにほぼ解き終えているのですがもう一度やっています。これは
- まだ解けていない難しい問題を解かないと成長できない
- 解けた爽快感を味わいたい
これらを両立するためです。同時に復習にもなります。解説を見ながら解いた問題も多いので、今度は解説を見ずに解けるかどうかを試します。自分の力だけで解けるようになった問題、前回も解けたけど今回はもっと簡潔なコードが書けた問題などがあり数ヶ月前に比べて自分の成長を実感できました。復習しながらなので総ACはあまり増えていません(前回までに740、今回までに898)が、この数値だけでは計れない復習の効果が出ているはずです。
また、解きながらその問題が何を要求しているのか、自分が何に気づけなかったのかなど簡単なメモを問題ごとに残しました。なおそれぞれのコードにはもっと細かくコメントを残しています。
C-D問題の復習の効果
C-D問題の復習によりコードを書く速さが上がり、またミスをすることが減りました。コンテストでは速度を争うのでこれはかなり大事です。また、今までなんとなく書いていた基本的なアルゴリズムについて振り返るきっかけになりました。具体的には以前記事にした尺取り法、DFS などです。とにかく何度も何度も使ってみて手が勝手にコードを書くぐらいにまで馴染ませるのが大事だと思いました。
前回のコンテスト(ABC388)では何度も二分探索を使ったのですが、添字のずれが気になって何度も書き直す場面がありました。これにはまると無駄に時間を浪費してしまいますから、次はこれを復習する必要がありますね。bisect_left, bisect_right の違い、0-index と 1-index の区別などライブラリ整理が必要そうです。
E問題への挑戦、実装面に難
E問題はわずかながら自分でも解けた問題はありましたが、大半の問題は解説を見ながらのACです。さらに言えば解説を読んでもなおわからない問題が多数ありました。解説の内容が理解できない問題もありましたが、多くの問題は実装でつまづいています。これは競技プログラミングが下手というよりそもそもプログラミングが下手なんですね。実装を上手にやれてこそプログラマーだと思うので自分としてはAtCoderとは関係なく克服したい課題と捉えています。
レート上昇
グラフを見ればわかるように、ここ2回は運良く一気に伸びましたがそれまでは緩やかに直線的に伸びています。月ごとに平均パフォーマンスを求めてみると以下の通りでした。
- 8月 947.75 (レート745~829)
- 9月 917.0 (レート819~859)
- 10月 1053.0 (レート890~916)
- 11月 885.25 (レート889~914)
- 12月 1040.0 (レート921~951)
11月など一部落ち込んだ場面もありましたが、多くの回で現在のレートよりも少し高いパフォーマンスが出て少しずつレートが上がっていきました。レートこそ上がっているもののパフォーマンスが伸び悩んでいるため、いずれ頭打ちになることが予想されました。レートが追いつく前に自分の実力を上げないと停滞してしまいます。
その後1月にいきなり2回連続の水パフォが出てレートを大きく上げています。上振れしたことでこの先にちょっと希望が持てました。
今後レートを上げるには
過去の傾向を見ていると多くの人が解けた問題は僕も解けて多くの人が解けない問題はやっぱり僕も解けないことがわかります。ざっと見た感じでは水diffの問題が解けたのは2回だけ、それも水の中では低い方です。少しずつ難しい問題も解けるようにしていきたいですが、先に書いたようにE問題を解き進めるのは容易なことではないので進行はゆっくりです。
逆に茶色などdiffの低い問題が解けなかったり、解けても非常に時間がかかってしまったりと直すべき点も見られます。解く速度はかなり大事で、ABC388ではすぐに答えを思いついたおかげで自分としては異様なほど高いパフォーマンスが出ました。ですから、難しい問題を解けるようにする一方で基礎をしっかり固め、簡単な問題を素早く確実に解けるようにすることが大事だと思いました。ちなみにこれは僕の中学受験や大学受験を思い出しても同じ傾向です。自分だけが都合良く答えを思いつける難問なんてそうそうないんですよね。
水になれたらいいなあと淡い期待を抱きつつ、今年も競技プログラミングを楽しんでいきたいと思います。