AtCoder黄色になりました


毎度おなじみ、変色エントリーです。
こないだのABC152でとうとう黄色コーダーになることができたのでまた少し感想など残しておこうと思います。

精進の方法について

青になってからはかなりコンテストが多かったので、自分で猛烈に精進せずともかなり解く問題の量は多かったように思えます。
AtCoderとこどふぉとゆきこにしっかりと出ていればそれだけでかなりの問題数をこなせるので、無理をして過去問を大量にやる必要もありませんでした(もちろん時間的余裕があるならやるに越したことはありませんが)。
AtCoderに関しては600以降の重めの問題を多く残しているため、気が向いた時に頭の中に数問入れておいて暇な時に考察する、みたいなことをしばらくやっていました。
他の作業ができない虚無みたいなイベントとかの時に時間を有効活用できるのでおすすめです。

身に付けた技術について

昔考えていたよりは大して新しい知識はついていない気がします。文字列系のアルゴリズム、いろいろできるセグ木、包除とかいくつか増えた部分もありますがそこがレートの伸びに直結した気はあまりしないです。ただ、明らかに既に身に付けているアルゴリズムをどんなパターンの時に適用すべきか、みたいな選球眼の部分は問題数をこなしてく過程で良くなってきているのは感じました。

モチベーションの源は何か

黄色あたりまでくる人は何かしらモチベーションの源となる何かがあって競プロを続けていると思います。競うことが好きな人もいれば難しい問題を解くことが好きな人、綺麗なコードや短いコードを書くのが好きな人もいます。
僕のモチベーションは「この人には勝ちたいなという格上の相手を見定めて、レート差を一瞬で縮めて追い抜くこと」です。僕は問題を解くことはもちろん好きですが、競争やレーティングのシステムがより大好きな人間なので、レートが1でも上がって順位が1つでも上がることに快感を覚えます。レーティングに色をつけるというシステムはとても良いと思っていて、数値よりレベルがわかりやすくなるとともに色の境目を超えた時の達成感が何もないときに比べて桁違いです。色を跨いだだけで一気に力が湧いてきたような錯覚を見せてくれます。また、常に自分よりちょっとレベルの上だけが見えていて、そこにたどり着くと前まで見えていなかったまたその先の敵が見えてくる、みたいなゲームのような展開もすごい好きです。今は黄色になったので橙という世界の住人がわずかに見えてきた気がします。

レートを上げるために必要なこと

青あたりでレートを上げるために何が大事なんだろうなーと最近考えることが多かったです。もちろん毎回のコンテストで難しい問題を華麗にACすればものすごいペースでレートは上がるのでそれが理想なのですがなかなかうまくいかないのが現状です。
自分は正直言ってレートという数値をかなり気にしている部類だと思います。レートに拘らずに難しい問題を解くことが楽しいという人も一定数いますが、僕はコンテストに出て1でもレートが上がって上位に行くことにやりがいを感じている人間です。もちろん難しい問題に時間をかけて粘って解けた時の快感みたいのも好きです。
レートを上げていくために一番大切なのは「レートを下げないこと」だと思っています。当たり前のように聞こえてしまいますが、めちゃくちゃ難しいことです。
自分と同じくらいのレート帯にいる人で結構な回数橙パフォを出して大成功しているけどレートはそこまで高くないみたいな人もいますが、そういう人はそれだけ激冷えをしているということです。

f:id:yuji9511yuji:20200121005849p:plain
パフォーマンス推移 (2019/06/22~)

これは青色になってから黄色を達成するまでのパフォーマンス遷移です。大成功した回こそそこまで多くないものの、下振れを引く回数がかなり抑えられていると思います。黄色に入った人でここまで橙パフォを出せないのもなかなか問題だろうという気もしていますが...。 黄色からレートを上げていくにはこの状態では限界があるものの、黄色を達成するという状況においてはこういったパフォーマンスを出すことで比較的スムーズにレートを上げていくことができました。ただ、特に1900を超えてきたあたりからはある程度うまく行ってもレートは微増なので失敗をしないままある程度の成功をし続ける必要があって大変でした。

レートを下げないために実行していることはいくつかあると思いますが、まず大事なのは必ずA問題から解き始めることだと思っています。ある程度できるようになってくるとこの問題が解けたら提出、みたいなムーブをしている人が増えていく印象ですが、途中から提出する人のパフォーマンスが安定しているのをあまり見たことがない気がします。予想外のコーナーを踏んで慌てて前の問題を通すも順位はかなり下がるような状況の人をよく見かけます。
もう少しレートが上がってくるとこのムーブは意味を成してくるかもしれません(問題の得意不得意が結果に如実に影響しそうな橙あたり〜)。ただ青くらいの段階でこれをやるメリットをあまり感じません。この問題が解けたら出す、みたいなことをする人が結構いますが、苦手な問題が入っていたらどうせその回をしのいだところでその先大して上がらないので大人しく前からやればいいと思います。前から解けば自分より2つ以上下のパフォーマンスをとるなんてことはそうそう起こらないはずなので、安定感は増すと思います。ただ大成功の確率は多少下がると思うので同時出しのギャンブル性がクセになっている人は楽しい方を選ぶべきです。

また、黄色になるまでは「みんなが解ける問題を落とす」が致命的になります。僕は考察の難易度が高くなる800~はほとんど通した経験はないですが、逆に比較的通す人が多い~600の問題を落とす率はかなり抑えていると思います。
比較的簡単な問題で詰まったときにいったん他の問題に逃げるべきか、みたいな葛藤に苦しむことがあるかもしれませんが、自分の場合はほとんどの場合その場に止まった方がいい結果が出ています。飛ばすということは少なくとも今解いている問題以上の配点の問題に取り組むということなので、余程得意分野に当たったなどの場合を除いてすんなり解ける確率はそれほど高くないと思っています。しかも、問題を飛ばした場合常に前の問題に意識が何割か持っていかれた状態になってしまう(ここを完全に切り替えられる人は尊敬します)ので、パフォーマンスを最大限発揮できない状態になってしまいます。上手な人はあとの問題に賭けて成功するようなこともしていますが、僕が今までそのような状況になったときには大抵同じ問題にとどまった方が良い結果をえている気がします。もちろん本戦枠・賞金がかかっている場合などはこの限りではなく起死回生の一手を狙うしかないと思います。

その他にも自分に関する特徴として、「比較的ペナを出しづらい」傾向にあると思っています。
実装と考察どちらが得意かどうか二分するのが競プロ界隈の特徴でもありますが、僕は完全に実装側に寄っているタイプだと思っています。比較的考察はスムーズにいく問題に関して、バグを埋め込まない実装しやすいコードを高速で書くことには長けていると思っています。
バグを埋め込まないための実装をするためにはいろいろな工夫も行っていて、同じ処理を行う変数は毎回確実に同じものが使える状況にする、スペースの区切りやif文をワンライナーにする時の条件などは全て統一しておく、実装が複雑だった問題はコンテストが終わった後にリファクタリングしてみて本番中にどこまでだったら綺麗な状態で実装できそうか考えてみる、などです。また、ライブラリの使い方周りでバグを踏んだ場合はそのライブラリが自分に合っていないということなので何かしらの改善を行います。ライブラリは使い始めこそ人のコピーを使うものの(これ重要です。いきなりスクラッチで書くと確実にバグを埋め込むのでお勧めしません)、場数を踏むごとに自分の使いやすい形にどんどん変形していきます。

マクロは必要最低限に留めています。マクロを多用するとバグが発生したときに少なからずそちら側まで疑う必要性が出てくるのが苦痛でしかないからです。自分にとって確実に必要なのはfor文のrepマクロ(確実に時短になる、添字ミスが減る)、可変長のprintマクロ(Pythonライクにデバッグできる、printデバッグの人間なので重宝しています)、using ll = long long;(こと競プロに限ればint64で全て統一した方がミスは確実に減ると思います、ここで意固地になって定期的にオーバーフローを踏む必要性が皆無)くらいだと思っています。バグを埋め込まなくするのは不可能なので、バグがあるとわかったときに疑うべきポイントを予め可能な限り潰しておくことが大事になってくると思っています。

これからの立ち回り方

こんな感じで黄色まではかなり守備力の高そうな立ち回りをしていましたが、ここからはそうも言ってられなくなります。
現時点の自分の実力だと橙パフォに届くボーダーの問題のAC率がかなり低いためレートが上がらなくなります。
このままコンテストにで続けた場合、おそらく黄色と青の狭間を永遠にさまようことになると思います。ここを打破するためにはやはりその得点帯の問題をみるしかなくなってくると思います。長いこと特定のレベル帯に絞った精進というものをしてきませんでしたが、そろそろ再開する頃合いだと思います。
f:id:yuji9511yuji:20200123225451p:plain
AtCoderの埋めはこんな感じです。黄色にしてはやる気のない精進してますね。700~800あたりの問題は結構在庫が豊富にあるので、まずはこの辺の問題を重点的に取り組むことで力をつけて行こうと思っています。
あと、少し前に手をつけ始めたのですがJOIの過去問埋めもなかなか面白いです。AtCoderとはまた違ったタイプの問題と触れ合うことができるのでこちらも8-9あたりを定期的にやっていきたいと思います。

さいごに

現時点では令和ABCに助けられて黄色にタッチしただけなのでまだ黄色の実力はほとんどありませんがまずは青落ち圏内を脱するように頑張りたいと思います。 次の変色である橙があまりにも遠いですね。これが最後の変色エントリーにならないことを願っています。