はじめに
2023年12月16日のABC333にて、入青しました!!!!!!!!!!!
この記事では、グラフの通り入水とともに半年程度停滞してしまったことや転機などについて、自分語りを交えながら気ままに書いていきたいと思います。
自己紹介
獅子座じゃない人です。
某高専の5年生で、春から筑波大学の情報学群情報科学類(coins)に編入学します。(編入体験記書かなきゃと思いながら4,5ヶ月が経っている…)
友達が始めたのを機にAtCoderを始めるまでは、高専プロコンなども含めて競技プログラミングとはほぼ無縁でした。なので、競技プログラミング歴は1年半弱です。
コーディング歴はとても長いと思います。
未就学児か小学校低学年の頃には親から与えられたBASICやExcel VBAを触っていました。
また、小学校高学年の頃には太鼓さん次郎の創作譜面にハマっていました。
ほぼ独学ですが、数学歴も長いほうです。
未就学児の頃には開平法にハマっていました。
中学生では数検2級レベルの高校数学を習得し、高専に入ってからは授業で習わない代数学などの勉強もしていました。
また、独学および高専の離散数学の授業で、集合と写像を理解していたのは大きいと思います。
入青するまでの振り返り
入水するまで
AtCoderは3完するのも難しいという噂を周りから聞いていたので、自分はずっと避けていました。
やり始めたきっかけは、編入のためにAtCoderをやり始めた友達のABCのE問題の解説ACを手伝ったことです。意外と解けそうという感覚がしたので、始めてみることにしました。
ただし、丸腰でコンテストに参加するのもアレだと思ったので、当時の直近の問題を何回ぶんか解いてはいました。
そして、1回目のABCで茶パフォ、2回目のABCで水パフォを出し、3回目のABCで入茶しました。今思えばここで成功体験を得たのはあんまり良いことではなかったですね。
そのままの勢いで1回も冷えることなく入緑も果たしました。
緑では流石に何回か冷えましたが、2回ほど青パフォを出したのもあり、始めてから3,4ヶ月で入水することができました。
入水直後
明らかに温まりと冷えを繰り返すようになってしまいました。
青パフォを出すことも緑パフォを出すことも多いタイプなので、相殺されて結果的に1300付近を半年くらい行き来してしまいました。
また、このときは編入試験に対する不安感も大きく、冷えた後荒れてしまうことも何回かあった気がします。
トヨタコンの決勝イベント
運良く、3月のトヨタコンの決勝イベントに参加することができ、懇親会でぷせうどさんと話すことができました。
このとき、自分とぷせうどさんの精進のタイプの違いについて話したり、自分がライブラリの整備を渋っていることに対してライブラリは作ったほうがよいと教えてもらったりしました。
https://twitter.com/pseudo_thermal
この後、自分は水色のままぷせうどさんは入黄まで行ってしまったので、自分も頑張らなければという気持ちになりました。
上昇
今年度に入り、いよいよもって編入試験に力を入れる必要が出てきたので、レートが1400を突破したら一旦Rated参加をやめることにしました。
それがモチベーションになったのか、追い込まれたことで逆にストレスが減ったのか、数回かけて上昇し、5月27日に1400を突破しました。
この上昇の原因は自分でも分析できませんが、ただ単に回数を重ねたために自分の短所は残りつつも実力が上がったと解釈するのが順当ではないでしょうか。
また、この頃は言語アップデートを楽しみに楽しみに待っていました。
C++からRustに移って、ライブラリの整備をしたいからです。
上振れと阻まれた入青
なぜか編入試験は全部合格していたので、再びRated参加を始めました。
最初は冷えたものの上振れが続き、言語アップデート直後であることに乗じて初めての黄パフォを出したことにより、一時1556までたどり着きました。
しかし、その次のAGCで緑パフォを出してしまい、入青は阻まれました。
WSL破壊と転機
ひょんなことから環境構築をミスしてWSLが動かなくなってしまいました。さらに私はミスを重ね、バックアップをとらないままWSLを初期化してしまいました。
途方に暮れましたが、どうせまたAtCoder用のツールを入れ直すならばと、Rustに移行することを決めました。
その日のうちにライブラリの整備も始め、Rustで競プロをすることに慣れるために過去の問題を解き直しもしました。
最初の数回は、「慣れてるC++ならばもうちょっと早く書けたのに~~~~~~~~~~~」という我慢が続きました。
9月~11月で少し下振れているのはそれが理由だと思います。とはいえ、大冷えがなかったのはよかったです。
また、はてなブログでの精進も始めました。始めた直後にリアルが急に忙しくなり、一時中断しましたが今も続けています。
Rustでの競プロに慣れ、ライブラリも充実してきたあたりで、キーエンスコンでの大冷えをきっかけに覚醒し、上振れを引き続け入青しました。
入青のために役立ったこと
言語アップデートとC++からRustへの移行
静的型付けが大好きで、インテリセンスやエラー検出などのエディタの機能が存分に発揮できる仕様の言語が大好きなので、Rustが大好きです。
言語アップデートでac-library-rsなどのクレートが標準搭載されたのもあり、Rustに移行することができたのは確実に入青の一因だと思っています。
そして、cargo-competeがとても便利で、とても助かっています。
github.com
ライブラリの整備
ぷせうどさんの言う通りでした。
自分は問題を早く解くのが苦手で難しい問題を解いてレートを上げてきたタイプだと自覚しているのですが、ライブラリの整備によって自分の苦手な早解きが多少できるようになりました。
特に、F問題が時間をかければ解けるタイプの問題のときに、ライブラリのおかげでD問題までの時間を省けているのはとても大きいです。
特に標準出力や標準エラー出力の関数・マクロ、二分探索の関数、累積和の関数あたりが確実にレートを底上げしています。
標準エラー出力を、標準のものとは違いデバッグビルドでしか出力しないようにすることで間違えてデバッグ出力を残して提出してしまってもTLEにならないようになっているのも大きいです。
書きすぎて、4000行130KiBくらいになっていてそろそろ取捨選択したいですがね…
競技の側面に慣れてきたこと
自分は1つのことに執着するタイプで、1つ後の問題が解けたのに、その前の問題に心中して大冷えしてしまうことが何回もありました。
ずっとそうしないように心掛けてきたのですが、なかなか実行ができず。
しかし、キーエンスコンでの大冷えをきっかけに、確実に実行できるようになってきました。
たとえば、ABC332ではE問題でWAを出した後、F問題を見てすぐさまACすることで入青に立直をかけました。
はてなブログに解き直しの記事を投稿し始めたこと
時間はかなり取られるので効率の良い方法ではありません。ですが、自分には合っていました。
コーディング歴が長く、すぐに入茶したのもあり、ABCの最初のほうの問題は解き直すことがほとんどありませんでした。
しかし、解き直しすることで単純な実装を考える機会になっています。
そして、単純な実装を考えることは、簡単な問題から難しい問題までとても大事なことで、実装ミスの可能性を減らしていると思います。
あと、「AtCoder Typical Components (β)」という記事も投稿しているのですが、結果的にはこちらは入青にはあまり役立たなかったです。
強いて言うなら、ライブラリの整備のときに整備したいアルゴリズムの類題を探せることくらい。
とはいっても、結構Xでのブックマーク数も多いのでもちろん更新は続けます。
関係なさそうで関係あったこと
麻雀
競プロerのみなさんは麻雀と聞いてどのようなイメージをされるでしょうか。
実は今、競技麻雀は週4放送で毎日視聴者数が100万人を超えるような一大コンテンツなのです。
そして、私は競技麻雀を見たり、上手くはないですが(雀魂では雀豪1)ちょっと打ったりしています。
それが競プロとどう関係するかというと、押し引きのバランスが良くなりました。
私は牌効率をそこまで習得していないので、雀豪まではほぼ押し引きでたどり着きました。
また、観る雀も大好きなので、プロの押し引きを見る機会は多いです。
最近、1つの問題に執着しなくなった1つの理由は確実にこれだと思います。
こういう時の心境って先制立直がかかったときと似ていると思うんですよね。すぐには降りない、でも全ツッパはしないみたいなバランス感覚が鍛えられたからこそだと思います。
おわりに
長くなってしまいましたが、色変を目指しているみなさんに特に伝えたいことをまとめるならば以下のようになるでしょうか。
「自分が問題を早く解くタイプか、難しい問題を解けるタイプか見極め、自分の苦手なほうのことも多少できるようになるために、精進の方法を変えてみたりライブラリを整備してみたりする。」