AtCoderで水色になってうれしくなっているunidayoが、よくある感じに振り返っていろいろ書いていきます。
unidayoが水色になるまで
AtCoder関係の情報はこんな感じです。
言語:Python(ほぼPyPy)
Rated参加回数:14回
AtCoderをやる前の初期状態はこんな感じです。
- ちゃんとしたプログラミングの教育は受けていない
- 卒論でMA○LABを1年使って遊んでいた
- Pythonはあまり文法を覚えていない(本を1冊読んだだけ)
- なぜAtCoderをやろうと思ったかは覚えていない
プログラミング未経験ではありませんが、初心者ではないかというと微妙なところだと思います。
いままでやったこと
水色になるまでに、やったことを振り返ってみます。
コンテストは毎回出た
やる気があるので、毎回コンテストに出ました。やる気があるから毎回出ただけで、別に気分じゃないときは出なくても、実力は上がると思います。
むしろ、「毎回出ないといけない」と思い込んでしまうと義務感が生じてやめたくなりそうなので、これからはたまに出ないようにしようと思っています。
コンテスト中はとても真面目にやっていました。コンテスト後は、解けなかった問題をやったりやらなかったりしました。疲れて眠いので仕方ないです。
あと、コンテストの日はお酒を飲まないようにしました。パフォーマンスだけでなく、健康にもよくて一石二鳥です。
過去問の解き方
過去問をどう解いたか振り返ってみます。
まずは、AtCoder Problemsの数字を見てみます。解いた問題は370問です。
次はDifficultyの内訳です。Difficultyは難易度の目安としてとても便利だと思っていますが、完全に正確なわけではないと思うので、参考程度に見てください。
灰色が半分くらい、茶色と緑で3分の1くらい、残りが水色以上です。青以上はだいたい水色になってから解いた問題です。
基本的には、そのときの実力に見合った問題を解いて、段階的にステップアップしていきました。たまに気分転換で難しい問題をやることはありました。
簡単なA,B問題も、あまり考えたくないときにやりました。「虚無埋め」と言われることもありますが、真面目にやれば、速解きの練習、簡単な実装を考える練習になると思います。
解説を見るタイミング
必要なアルゴリズムを知らないといくら考えても無理なので、わからなかったら割とすぐに解説を見るようにしています。2,3分で見ることもあります。
そのあと、「この問題めんどくさそうなうえ、理解してもあんまり役に立たなそう」か「まだレベルが高すぎるから後でいい」と思ったときはそのまま放置するか、適当に人のコードを見てふわっと理解して終わりにしました。
逆に、「この問題は理解しておかないと困りそう」か「なんか典型問題っぽい」と思ったときはちゃんと理解するまで考えました。1問に2,3時間かけることも結構ありました。
どれくらいできると水色になれるか?
unidayoは14回のコンテスト参加で水色になりました。
参加回数が14回ちょうどの日本人は580人いて、そのうち水色以上は36人、割合でいうと6%しかいません。(全ユーザーだと141/792で18%ですが、わざわざ海外から参加する人はほぼ競プロ経験者でしょう)
自分で言うのもなんですが、参加回数14回で水色は、けっこう順調にレートが伸びたほうだといえます。
コンテストでどういう成績を取ったおかげで「けっこう順調にレートが伸びた」のか、振り返ってみます。
コンテスト結果とパフォーマンス
まずは、コンテスト成績表を見てみます。
はじめの1ヶ月はほぼ茶パフォでした。それからは、緑と水色以上のパフォが半々くらいです。
茶色から緑には、コンテストの相性が良かったおかげで一瞬でなれましたが、緑になってからは少しずつレートを上げていった感じです。
レートが下がったのは14回中2回でダメージは合計-29と、これまで大きな失敗はしませんでした。
コンテストごとのACと時間
順位とパフォーマンスだけ見ても、何ができたのかわからないので、各コンテストのACした問題と、時間(ペナルティ込み)を見てみます。
ABC級コンテストでE問題以降を通したのは、一度だけです。
緑になってからのABCでは、D問題までWAを1度も出していません。(緑はAGC043から、ABC161の2WAはF問題)そして、水パフォや青パフォを出したときはそこそこの速度で解いています。
D問題までそこそこ速く解ければ水色になれる
E問題を通せなくても、D問題まで高確率でそこそこ速く解ければ、あまり停滞せずに水色になれるということがわかりました。
「早解きできないけど、だいたいEを通して水色になる人」や「たまにDを落とすけど、たまにEまで速く通して水色になる人」もいると思いますが、どちらにせよ、Eを解くための時間を残すには、Dまで5,60分で解く必要があると思います。
Dが安定しない段階でEを練習しても、解くための時間を残せなさそうです。緑の間はDを確実に解けるようにがんばったほうがいいと思いました。
どうするとD問題までそこそこ速く解けるようになるか
Dまで速く解くためにやったことや、工夫したことを書き出してみます。
- C問題やD問題をいっぱい解く
- Pythonの便利なやつを覚える(enumerateやzip、collectionsやitertoolsモジュールなど色々)
- ライブラリを少し用意しておく(UnionFindや素数、約数列挙くらい)
- IDEの設定をいろいろする
- 入力補完やスニペットを使う
- 無駄なWAを出さないように、サンプルは絶対に全部確認する
- モニタを2枚使う(2枚あればコードと問題文を同時に見れて、3枚あるとツイッターも見れる)
読んだ本
AtCoder以外でも本を読んでちょっと勉強していたので、最近読んだ本を紹介します。
基本的にはAtCoderの勉強はAtCoderでしたほうがいいと思いますが、本から得られるものも結構ありました。
Pythonの本
どれもそんなに真面目には読んでないです。
入門Python3はPythonを覚えるために読みました。Pythonに入門する人向けで、プログラミングに入門する人向けではないと思います。
他はまあなんかおもしろいねって感じです。どれもそこそこAtCoderの役に立っています。
他の本
蟻本は適当に読んだだけです。「なんかそんなん蟻本にあったな」ってなるくらいです。今なら初級編はだいたいわかると思います。(最短経路問題や最小全域木はライブラリに頼りますが)
リーダブルコードは競プロ向けではないように見えますが、「変数名をわかりやすくつける」「一度に一つのことだけする」あたりは、結構競プロでも大事だと思います。
応用情報はほぼ関係ないですが、丸め誤差の知識がパナ2020のC問題で役に立ったかもしれません。逆に、AtCoderのおかげで、応用情報午後のアルゴリズムが簡単にできるようになったのはあります。開催中止になりましたが……。
これから
最後に、これからの青になるための方針を書いて終わりにします。
- E,F問題を解けないと青になれないので、練習します
- 考察が必要な問題が増えそうなので、解説を見ないで考える時間を増やします
青になった記事も書けるようにがんばりたいです。