AtCoderで青になりました

f:id:andoreiji11:20200726213427p:plain 2020/7/25 M-SOLUTIONSプロコンオープン2020で、AtCoder青色レートになりました!

実に一年近くを過ごした水色レートを卒業できてとても嬉しいです。

実は青色レートが現実的な視野に入ってきたのはごく最近です。6月の後半ぐらいで、1800〜2100程度のパフォーマンスが連続して出るようになり、この頃ようやく青に行けそうだという気持ちになってきました。それまで、2019年夏から今年の初夏ごろまでは1200 - 1400を上下する、いわゆる「停滞」期間に入っていました。なかなか思うようにAtCoderでいい成績が出せず、辛い気持ちになることも多かったです。

よく言われるように精進の結果が現れるには時間差があるのだと思います。ところが自分は言葉にできるような体系的な(?)精進をあまりしていないように思えます。

f:id:andoreiji11:20200727213839p:plain

f:id:andoreiji11:20200727213916p:plain

これを見るとわかるように、特に何かを「埋めた」というわけでもありません。強い競プロerや精進をたくさんしている人がABC-A,Bを全部埋めたとか、○色 を全部埋めたという話をしていますが、自分にはとてもその手の「達成」ができる体力や精神力が備わっていない(これは人生における大きな自分の欠点であるという自覚はあります)わけです。じゃあ才能があったのか?と言われると、もちろんそんなわけはないです。自分は極めていい加減な人間です。積み上げが苦手で、集中力が乏しく、物事に対する姿勢は怠惰で、粗雑な人間です。

僕はコンテスト中のアドレナリン、エクスタシーをモチベーションに競プロをやっていることに最近気がつきました。僕はratedコンテストが好きです。unratedになると結構本気で怒ります。...僕は結構根に持つタイプなのかもしれません。

でも、僕が水色から400レートを伸ばすことができた原因が一つあるとしたらコンテストに拘ることだったかもしれません。誰だってコンテストには本気で出ていると思います。辛い気持ちになってまで競プロを続けるべきではないというツイートをよく見ますし、それは人生という枠組みにおいて多分正しいですが、僕は辛い気持ちになったから青になれたと思っています。それは自分に数理的才能と教養が備わらず、人生においてきちんと自分を涵養できなかったことに他なりません。それならば辛いのは自業自得ではないか?と言われるとやっぱりそうかもしれません。

僕はAtCoderが伸び悩み辛い時期にcodeforcesでは比較的好成績を出すこともできたのでそれをモチベーションにしていました。こどふぉはこどふぉで勉強になります。

コンテストで冷えたり、現状維持に近いような成果しか出せなかった回には必ず実戦的な失敗があります。コーナーケースを見落として200点問題でWAを吐く、WAで焦って冷静さを欠き後ろの問題に特攻してほとんどの人がとけた400点をとうとう解けずにコンテスト終了、32bit整数型のオーバーフロー、多重ループで添字をミスってデバッグに時間を溶かす...実戦的な失敗は決して「高度なアルゴリズム・考察がコンテスト中に生えなかった」ことへの後悔ではありません(少なくとも水色→青色においては)。

f:id:andoreiji11:20200727233639p:plain

(イラストに特に意味はありません。ちょっとした目の保養です。)

僕はあまり理性的な人間ではないのかもしれません。よく競プロは論理的思考力に強く依存すると言われますが、論理も大事ですが、より重要なのが理性だと思っています。適切に人生を進めることが競プロに時間を捻出するために重要な行為です。というかそもそも僕はあまり論理的思考というものの存在を信じていない節があります。僕がコンテスト中しばしば陥りがちな、感情と身体感覚だけに駆動されて振る舞いを決定するのは例えば性に溺れた猿的人間のそれとほとんど変わらないような気がしています。

それでも、毎回のコンテストに出ることで、多くの反省と、時々はちょっと成功したという喜びを胸に、より理性的で適切な振る舞いを身につけていくことが次のパフォーマンスにつながると信じています。

...ここまで書いて、それでもやっぱりここまで読んでくれた人のためにちょっとは競プロ的に役立つことも書いておかないと申し訳がない気がするので、ちょっとだけ競プロの話をします。

別に意図しているわけではないと思いますが、ABCでは必要とされるアルゴリズムや解法が連続して出題される傾向があるように思われます。ある時期には文字列アルゴが連続して出たり、またある時期には二分探索的手法、全方位木DPがABC->CF->ABCみたいな感じで立て続けで出題された時期もあって、それで自分含め全方位木DPを勉強した人は多かったと思います。最近は数え上げが多い気がします。得意分野と言えるものは特にありませんが強いて言えば数え上げが後ろの方にあった時はパフォーマンスが高めだったと思います。ABCに限らず、コンテストはそれぞれに独特の出題傾向があります。継続してコンテストに出続けることでそのコンテストに慣れていくことや傾向を掴んでいくことがレーティングの上ではある程度意味があると思います。

f:id:andoreiji11:20200727233748p:plain

(イラストに特に意味はありません。ちょっとした目の保養です。)

コンテストに出て、復習する時に、二つのことに注意しています。一つは、先ほども述べたように、実戦的な反省、もう一つは、問題そのものの復習(新しい知見を獲得する)です。体に競プロを""わからせる""ことが重要です。

ライブラリの整備はほとんどしていません。日常的に使ってるライブラリはmodint(と二項係数)とUnionFindぐらいしかありません(特に抽象化とかもしてません)。ライブラリ整備はやろうやろうと言いつついつも先延ばしにしてしまいます。まあ二項係数、ダイクストラ、UnionFind、LCA、あとは線形文字列検索(Zアルゴとか)が一つあれば青に行くためには大抵十分だと思います。

競プロ界隈は結構ライブラリ整備とか知識増強を重視する傾向がありますが(茶色とか緑の人がツイッター経由でいろんなアルゴリズムの名前に触れていくのはいいけどなんか優先順位の判断が微妙そうな人をよく見ます、緑で遅延セグ木使う場面はないんじゃないかな...みたいな)、それよりもなんかもっと非言語的な部分で大事なことがあると僕は信じています。なんというか、いろいろなイメージ的知見が噛み合うと解ける問題の幅が広がり、また、コンテスト中で簡単な問題を落とさなくなると思います。特にABCが6問になってからABC-Fで結構知識が問われる問題が増えてきたことも影響していると思います。でも、知識やライブラリを固めてこれだけ知識とライブラリがあるんだからと安心して強い実装上のオプションを頭の中で思い浮かべられるようになるというのも大事なことだと思うので、今後は自分も知識増強を本格的に着手していこうと思います。

数学を鍛えたいので数学オリンピックの問題を最近は解いています。朝倉書店の『組み合わせ論の精選102問』『数論の精選104問』を解いています。難しいです。個人的にはこれが競プロに直接生きるという期待よりは、離散数学的な議論とかに慣れ親しむことが競プロの解説や議論についていく上で生きてくるかなぁと思ってやっています。(最近ちょっとサボり気味です)

f:id:andoreiji11:20200727233724p:plain

(イラストに特に意味はありません。ちょっとした目の保養です。)

まとまりがなくなってきましたが長くなってもあれなのでこの辺で切り上げようと思います。ここまで読んでくださりありがとうございました。いつか黄色エントリが書けるように精進したいと思います。その頃にはまた色々と見方が変わっているのかなぁ...

(ユーフォ久美子3年生編が完成しますように、サクラノ刻が出ますように)