AtCoder黄色になった!

ABC199 (Sponsored by Panasonic) で橙ぱふぉを取り、ついにAtCoder黄色になりました!!Beginner 卒業!

Panasonic 大好き、賞品付きコンテストもいっぱいお願いします。

2017年9月、高2の夏に初めてコンテストに参加してから3年半かかりました(長かった……)

どれくらい精進したら黄色になれるのかの目安の一つとして誰かの参考になればと思い、現状を記録しておきます。

精進の方向性

精進の方向性として

  • 低難度を速く、確実に解けるようにする
  • 高難度を解ける確率を上げていく

という2つがあると思いますが、私は前者が主でした。

f:id:HayatoY:20210424233253p:plain

https://atcoderapps.herokuapp.com/atcoderperformances/show_graph/?username=HayatoY&rivalname=&since=2019-11-23&until=2021-04-24

青になってからのパフォーマンスを見てみると、高いパフォーマンスが出せるようになったというより下振れが減ったという感じですね。特に2020年の夏ごろは振れ幅が大きかったです。

低難度で詰まることが減って、パフォーマンスが少しずつ安定するようになってきました。

低難度を速く、確実に

みんなが解ける問題を確実に通した上で、たまに難しい問題が解ければ、少しずつレートは上がっていきます。黄色になるには、まずは水diffまでを絶対に落とさない、青diffも時間制限無ければほぼ確実に通せる、くらいを目指すと良いと思います。

私が青だった期間の精進は基本的に以下の2つだけでした。

  • なるべくコンテストに出る
  • 時間があるときにABCのばちゃをやる

だって1問ずつ解くより順位表見ながらコンテストやった方が楽しいし、ABCの前半は簡単に解けてラクなので。

f:id:HayatoY:20210425145334p:plain

https://kenkoooo.com/atcoder/?user=HayatoY&kind=user#/user/HayatoY?userPageTab=Progress+Charts

これを見ても、灰・茶diffばっかり解いてて、やる気あんのかお前って感じです。

でも、低難度をいっぱい解くことにはちゃんと効果があると思っています。

簡単だからこそ、より簡潔な問題の言い換えや綺麗な実装というところを意識する余裕が生まれます。

また、簡単な問題でも、最低限公式解説には目を通していました。自分が気付いていなかった考え方やより良い実装のヒントが載っていることがあります。

競プロの考察の仕方みたいなものを、私は低難度をたくさん解いていく中で学んだ気がしています。

高難度を解けるように

高難度の問題は正直あまり解いていません。上で書いたようにABCをメインにやっていたので、ABCのE、F問題に高難度があったら頑張って考察していましたが、それくらいです。

ABCで安定して全完できるようになるには(あらゆる車輪を再発明できる天才でない限り)近道は無くて、自分の中で「典型」と思える問題、考え方を学んで増やしていくしかないと思います。

そういう意味で、「高難度をたくさん解いて考察力を高めるんだ!」と気張る必要は無くて、むしろ低難度問題でよく見るテクニックをしっかり学んで、いつでもすぐに使えるようにしていこう、という姿勢が大事だと思うのです。

高難度の問題に対する取り組み方は、コンテストで出たらやる程度で十分でしょう。

コンテスト中は時間いっぱい使って頑張って考察するようにします。コンテスト後は、もう少しで解けそうだったら粘ってみてもいいし、単に知識不足ということもあるので解説やTwitterを見て、次出たら解けるように覚えておこう、くらいのモチベーションで良いと思います。

アルゴリズム・データ構造の勉強の仕方について

蟻本

蟻本は、ちゃんと読みこんだのは半分くらいまでです。あとはコンテスト後に「蟻本○○ページ」みたいなツイートを見かけたら読んでみたり、コンテスト中詰まったときに関連しそうな部分の目次を眺めてみたり、辞書的な使い方をしています。

蟻本に載っていること全部を(簡単な応用ができるくらい)自分のものにできれば、それだけで少なくとも黄色にはなれるはずです。もちろん自分のものにするってそんなに簡単なことじゃないですけど。

ライブラリ

自分でライブラリ整理するのは、理解を深めるのにとても良いと思います。抽象化とかすると、言語に対する理解も深まります。

ただこれは相当時間のかかる作業なので、せっかくだから他の人が公開してくれているライブラリを使い込んでやろうぜ、というのが私の考えです。

よく使うライブラリで自分で用意しているのはModIntとUnionFindだけで、他はいつもLuzhiled’s Libraryにお世話になっています。

ライブラリは、その仕組みを知っていることよりも、いつ使えるのか、どうやって使うのかを知っていることの方が重要なんですよ。

もちろん応用を考えるなら仕組みを知っているに越したことはないですし、仕組みを知っている方が、いつ使えるのかということも理解しやすくなるでしょう。だから余裕があれば勉強してください。

でも水とか青とかの段階では、1つのデータ構造に精通することよりも、広く浅くを優先した方が良いと思います。

Twitter

Twitterで時間を浪費している時に、競プロブログが流れてくることがあります。そういうのはなるべく目を通すようにしています。

Twitterに流れてくるということは、複数人の目に触れていて、その記事の類題がもし直後のコンテストで出題されたら、本来の難易度よりdiffが下がる傾向が出るかもしれません。だから読んでおかないとまずいな、と。

この話は次の項目に続きます。

最近競プロのコミュニティについて思うこと

 競プロ界隈ってTwitterですごく密にコミュニケーションを取っていて、狭い世界ですよね。それで、トレンドみたいなものが結構はっきりあると思うんです。最近みんな○○を勉強してるな、みたいな。

みんな知識をTwitterやブログで共有していて、結構多くの人がそれを目にしています。だから、ABCで出された問題について「○○がこの前言ってたやつだ」みたいになってdiffが低めに出ることとかありますよね。

そんなことをずっと考えていたんですが、最近ちょうど分かりやすい例があって、それがこの「競プロ典型90問」です。

すごく良い企画だと思います。毎日取り組んでる人めちゃくちゃ多いですよね。

でも逆に言うと、これをやらないと「みんなにとっての典型」を自分だけ知らないという事態になり得る怖さがあります。

あとは蟻本も競プロer必携と言われていて(要出典)、蟻本に載っているかどうかでdiffが左右されるみたいなことが起きているんじゃないかと思います。

トレンドになっている知識は確実に押さえておかないと、ABCで大失敗が起き得るのではと気付いてしまったんですよ。

知識を共有して高め合えているという点で良い環境だなと思うと同時に、そこについて行けない怖さも感じるという話です。

私は界隈のトレンドに置いていかれないように、みんなが勉強していることは自分もやっておかなければ、というのがモチベーションになっていて、Twitterで紹介されているアルゴリズムの解説記事などを読むことが多いので、これからもそうしていきたいと思っています。

何かみなさんの思うことがあれば教えて欲しいです。

これから

今後はバチャをABCからARCに乗り変えようと思いますが、取り敢えず基本的なやり方は今まで通りで行きます。

やっぱりコンテストに出るのが一番楽しいので、しんどい精進はしたくないんですが、コンテストをより楽しむには実力を上げなきゃいけないんですよね。

ICPCでももっと結果を残せるようになりたいですし、焦らず少しずつ成長していければいいなーと思っています。

終わりに

1年以上放置されたこのブログですが、黄色になったので他人の役に立つ発信ができるのでは、と思い立ち取り敢えず色変記事を書きました。また気が向いたら何か書くかもしれません。

今読み返して気付いたのですが、「最近競プロのコミュニティについて思うこと」の部分は別記事にした方が良かったのでは。まあなんでもいいや。

最後まで読んでくださりありがとうございました!