AtCoder 黄色になりました

ここに1人の競プロerがいます。レート推移を見てみましょう。

ああ、完全に緑適正で停滞していますね、水に上がれる日が来るのかも怪しそうな雰囲気です。

そして、この人のその後の推移がこちら。

というわけで、AtCoder黄色になりました。という記事です。

特異性

AtCoder暖色の方のレート推移って、ほとんどが水や青までは一瞬で上がって、そこから緩やかに上がっていく、という崖状の形をしていると思います。

一方で、緑を脱出するのに1年4ヶ月(半年間の空白を除くと8ヶ月)もかけている僕の推移はだいぶ特異なものだと思っています。

いきなり自慢のようなものを垂れ流していますが(そもそも色変記事なんて自慢が本質な気もしますが)これには意図があって、僕の推移は、同じように緑や水で停滞して苦しんでいる方々の励みになり得るものだと思っています。思い上がりかもしれません。ただ、統計的な根拠から「黄色以上になれる人はみんな水まではあっさり上がってる」なんて言われたらそれなりの絶望感があるかと思うのですが、その反例のひとつとはなれているのではないでしょうか。

やってきた、意識してきたこと

僕の精進スタイル、競プロへの取り組み方のうち、他人とあまり同じでなさそうなものを取り上げて紹介します。

徹底的に下から埋める

精進は常に「ほとんど脳を働かせずに解ける問題」ばかり解いてきました。理由ですか?難しい問題を考えるのは疲れるからです。……というのも決して冗談ではないのですが、ひとつは、競プロに限らず「ボトムアップ」は強いと思っていて、それがこのスタイルに反映されています。詳しくはひとつ下の項で。

また、低難度の処理能力を上げると、高難度を解ける確率を上げるのに比べてパフォーマンスが圧倒的に安定します。もし青下位diffのE問題を解けなくても(黄色を目指すレベルならこれはだいぶつらい)、ひとつ前のD問題までを確実に高速に処理できていればぎりぎり青か水上位パフォくらいで耐えてくれます。もしこれが低難度を解くスピードが遅かった場合、大怪我になってしまいます。低難度早解きは正義です。

事故を無くせばレートは上がる。

実際のデータとして、AtCoder Problemsから得点/Difficulty別のAC数リストを貼っておきます。

なんと、黄色以上の問題は10問しか解いていません。しかもそのうち6問は本番ACなので、黄色以上を精進で解いたのはたった4問ということになります。1000点以上の問題も解いたことがありません。こんな状態でも黄色になれてしまうのだから不思議です。その代わり、緑以下は全て埋めています。

解説ACはしない

競プロを始めたての頃の数問を除いて、いわゆる解説ACという行為は一切しませんでした。

これには、ひとつ上の項の話とかなり近い「どんな問題も、先にそれより簡単な問題群をマスターしていれば自力で正答に辿り着けるはず」という思想があります。どんな、という強い形容詞をわざわざ使っておいてですが、もちろん例外もあります……。

自力で解けるまでは解説を絶対に見ない、という訳ではなくて、もし粘りに粘っても分からなかった時は大人しく解説を読みます。しかしその場では解かずに、「どういう考察をしたら自分の頭でもこれに辿り着けたか?」を考えるようにして、「いつか、直接的にその問題の解法を忘れた頃」に再挑戦するようにしています。と言っても、どうしても印象が抜けない問題というのは決して少なくないので、事実上の解説ACはしてしまっているのですが……(あれ?)

そもそも、長い時間粘っても分からないような問題には最初から取り組まない (もし今の自分の実力に対し問題が格上すぎると感じたら諦めてもっと簡単そうな問題を探して移っている)というのが実際のところです。

あと、AtCoder Problemsにかなり支配されていまっている思考なのですが、自力ACでないものを表の上で緑色にしたくない、という理由もあります。解説AC/自力ACを分けて登録できる機能ができたりしたら解説ACするようになってしまうかもしれません?

前から取り組んで解けたらすぐ出す、NoSub撤退はしない

レートを保つ目的で、コンテスト開始しばらくは提出をせずに手元で解いていって、順位表を伺ってこれは温まりそうだとなったら一気に提出するという戦略が存在しますが、これもやらないようにしています。

同じNoSub忌避勢でも、AGCで1問目から全く分からなかった場合はさすがに撤退するというような方が多いかと思いますが、そういったときもちゃんとレートを落とせるようにいつも開始直後にCEを投げています。

理由はいくつかあります。

実力より不当にレーティングを上げたくない

NoSubによって保ったレートは、言わば前借りだと思います。前借りでなんとかレートを保っても、その後のコンテストでレートが下がりやすくなるだけです。揮わなかった日は素直にレートを落としたいです。

参考ツイート

余計なことに脳のリソースを奪われたくない

これは出すべきか?待つべきか?やめとくか?といった判断に煩わされながらコンテストに取り組むのは疲れます。小難しいことは考えたくないです。解けたと思ったらすぐ出すと決めておけば、楽です。

競技で最大化するのはレートではなくパフォーマンス

※だいぶ思想が入ってしまっているので適当に読み流してください。ルールで制限されていない以上、NoSubをする方を批判する意図は一切ありません。

NoSubを肯定する根拠として「競技なのだからルールの範囲内でレートを最大化するのは 競技者として当然の戦略だ」というものをよく見ます。

これに関してですが、僕はそもそも競技プログラミングの「競技」は1コンテスト内の成績で完結しており、その上で一連の成績を適当な基準で統計したメタな指標としてレートが存在するものと捉えています。

「コンテストの成績を最大化する」という目的を持ったとき、撤退はむしろ順位表のビリより下の、 不戦敗を選んでいる行為になるはず、という理屈です。

そもそもの前提をひっくり返して、Submitをすることを選んだコンテストの中で平均的な成績を最大化する営みこそが競技プログラミングだ、と言われてしまうと確かに撤退は真っ当なテクニックだ、となってしまうんですけどね。むずかし~

おわりに

以上、読んでいただいた方はありがとうございました。

次の目標はもちろん橙ですが、ABCのカンストでしかまだ橙パフォを取ったことがないので、それはもうとてつもなく遠い目標ですね。

最後に雑な宣伝をすると、もしあなたが高校生や高専生ならばぜひ電気通信大学への入学を考えてみてください。競プロ大好きな仲間がたくさん待っています。共に2013年以来のICPC-WF進出、古豪復活を目指しましょう。