先月末に、めでたく AtCoder 黄色になりました。

1976 -> 2025 (+49)

念願の！！！！ 黄色！！！！ です✌️✌️✌️✌️✌️✌️✌️ pic.twitter.com/6S5whNlq8G — tsutaj (@_TTJR_) 2018年9月29日

きのう、ふと「黄色になりました記事書いてないなぁ」と思って雑に呟いたら、書いてくれという 圧力 声援を感じたので、記していこうかなと思います。記事の特性上自分語りしかありませんが、それでも良い方はお読みいただければと思います。

自分の能力について

世の中には、プログラミングを始める前から数学が大得意で、 AtCoder を初めて半年くらいで黄色になるような「競技プログラミングをするために生まれてきた天才」*1も中にはいるのですが、そのような人はごく僅かだと思います。

自分は B3 のころ、つまり 2 年半ほど前*2に、 C++ もアルゴリズムも何も知らない状態 (プログラミング経験は講義で C 言語をやっただけで、おそらく灰〜茶程度の実力です) で競技プログラミングを初め、青になるまでに 1 年かかり、黄色になるまでに更に 1 年半かかりました。数学は得意なのかというと、おそらく苦手な方です。高校生の頃は模試で「図形と方程式」の単元が 0 点だったこともありますし、大学入試本番の数学に関しても点数は半分も取れていません。そんな人でも黄色になれるんだなあ、と思っていただければ幸いです。

ステップアップのために何をしてきたか、の部分が多分いちばん見たいところだと思うので、それを中心に書いていきたいと思います。

やったこと

灰から茶へ

自分が競技プログラミングをはじめてからしばらく経ったのち AtCoder のレート制度が始まったのもあり、AtCoder レートにはあまり反映されていないのですが、自分にも灰色や茶色の時代は確かにありました*3。

C++やらないとあかんと思った — tsutaj (@_TTJR_) 2016年5月19日

この頃はまず C++ が書けなかったので、何も見ずにある程度書けるように頑張りました。C++ に慣れるために適しているのは、やはり AtCoder Beginner Contest の A 問題・B 問題あたりかなと思います。始めたての人あるあるだと思うんですが、整数が与えられる問題ばっかり解いてて「そろそろ慣れてきたな〜」ってときに文字列の問題来ると入出力でつまづくので萎えますよね、少なくとも自分はそうでした。自分なりに苦闘しながら、だんだん慣れていきました。そんなこんなで気づいたら ABC の A と B は埋まっていました。

とりあえずA全部解いた — tsutaj (@_TTJR_) 2016年6月11日

あと競プロを始めたと同時に蟻本を買いました。動的計画法も逆元も何もかもわからなくて大変でした。

茶から緑へ

言語に慣れてくると ABC の B くらいまでは自力で解けるようになってきますが、C 問題はそうもいきません。問題で問われていることを満たすようなアルゴリズムを自分で見つけてこなければなりません。これに対処するには、言語の慣れを鍛えるのではなくアルゴリズムを考える頭の方を鍛えるしかありません。というわけで ABC-C を埋め始めました。また、埋めるだけでは知識が足りないので、蟻本で補いました。 (どのへんをやっていたかはあまり覚えていませんが、初級編と中級の半分くらいはだいたいやったと思います、時間は無限にかかりました)

ABC C埋めの道のりは長いのう — tsutaj (@_TTJR_) 2016年6月30日

そうしていくうちに、遅いながらもだんだん C が解けるようになっていきました。

緑から水へ

水色になる前に ABC-C を埋め終わりました。2 〜 3 ヶ月くらいかかった気がします。

その 3 日後に水色になりました。 なぜかわかりませんが不服そうですね

2016/10/15 AtCoder Beginner Contest 046

1171 -> 1206 (+35)

こんなんで上がるのか・・・。何はともあれ1200超えたので次回からはARC出ます。 — tsutaj (@_TTJR_) October 15, 2016

水色になるためには ABC の C までが解けると良い、というのは TL でもたまに見ますが、実際そうだと思います。このときはまだ ABC-D はほぼ埋めていません。

ここまで来るのに使った知識は、全探索・BFS・DFS・標準ライブラリなどが主だったと思います。もちろん上に上がるために、蟻本を読んだり ARC の A や B も埋めていたりしていましたが、知識がコンテスト本番中に考察と結びつかず苦しんだ覚えがあります。

水から青へ

水色から青に上がるためには、勉強した知識をコンテスト中に応用できるようになる必要があると感じています。実際、これができるまでにかなり時間がかかりました。どうやったら応用できるのか？という話になりますが、自分の場合はひたすら問題を埋めて対処しました。ツイートを振り返ってみると、水色のうちに ARC の A と B も全て埋めていたようです。ARC の B は結構タフな問題も混じっているので埋めてみると面白いと思います。

ARC の B 埋めやっと終わった pic.twitter.com/k1RK3jUvlK — tsutaj (@_TTJR_) 2017年2月7日

問題を埋めていると、だんだん自分が知っていることをコンテスト中に活かせるようになってきました。コンテスト中に DP や最短経路がまともに書けるようになってきたのもこの時期からです。やはり経験は大事なのかなあ、という気がします。

競プロをやっていて印象的だった出来事のひとつとして、自分が出たコンテストでたまたまフローが出題され、それが解けたことで水色から青に上がれたということがあります*4。青になるまでにフローが重要視されることはあまりありませんが、それでも知識を蓄えておくというのはときに役に立つんだなあと思いました。勉強はやっておいて損はないです。

C: 切り方を H と W で全部試す (1 こ切ればあとは貪欲に)

F: S -> T への最小カット。頂点に cap があるバージョンなので蟻本の例のあれを書く — tsutaj (@_TTJR_) 2017年5月20日

1549 -> 1630 (+81)

青だぜ！！ pic.twitter.com/BYpsSfhVFv — tsutaj (@_TTJR_) 2017年5月20日

青から黄へ

ここからしばらく停滞が続きました。実際、青から黄色になるまでに 1 年半ほどかかっています。

何をしていたかというと、ABC-D を全て埋めたり、ARC-E をほぼ全部埋めたり*5、TDPC をほぼ全部埋めたり*6、気晴らしに AOJ を埋めたりしていました。あとは、Topcoder の Div1 Easy 埋めが有効とも聞いたので、それをしていた時期もありました。また、確率 DP のスライドなどなど、スライドを積極的に作るのも青になってからのことでした。

こんな感じで基本的には埋めることをしていたのですが、だんだん解説を読まなくなっていきました。というのも、コンテスト中に解法が自力で浮かばないと意味がないので、時間がかかっても良いから自分で思いつけるようにいろいろやっていました。勿論、どれだけ考えてもわからない問題もあるのでその場合は解説を見ます。考察の時間は大体 1 〜 2 時間が目安でしょうか・・・ずっとその問題だけ考えていたら人生が破滅するので、問題を頭の片隅に入れておいて、何か別の作業中にちょっと考えるのが良いかなあと思います。埋めのペースは減っていきますが、だんだん自力で解ける問題の幅が増えていきました。

今年の 5 月に、急激にレートが上がった時期がありました。何が原因でこんなに上がったのかは明確にはわかりませんが、Div1 Easy 埋めや ARC-E 埋めなどを春休みにある程度頑張っていたので、それが結びついてきたのかなあと雑に推測しています。埋めることは即効性はないものの、あとあと大事になってくるのかもしれません。

tsutaj とかいう人、5 月から中の人変わってないか pic.twitter.com/AQCKTNgyXJ — tsutaj (@_TTJR_) 2018年6月3日

5 月に入ってから黄色パフォが ARC でも AGC でも取れるようになっていき、先月に黄色の仲間入りができました。

最後に

長々と書き連ねていきましたが、結局やったことは端的に言うと次の通りです。

蟻本を読む

AtCoder 中心に、問題を (1800 問くらい) 埋める 特に、ABC は全部・ARC は E まで埋めると良いと思います

数学が壊滅的なので適宜復習したり、自分なりにまとめる

ABC を全部埋める、というとかなりヤバそうに感じますが、AtCoder Problems で一面緑になった問題表を見ることを夢見て頑張ると達成できるかもしれません (とはいえ、自分も 2 年近くかかったので、まあつらいです・・・)

自分の場合は解かないと身につかなかったので実際に解いていましたが、埋めなくとも解法が思いつけば問題はないので、それ相当の考察力を身につけるのも手です。自分にあった方法で磨きをかけると良いのかなと思います。

かなり長くなってしまいましたが、ここまで読んで下さりありがとうございました！いつかオレンジになりました記事も書けるように、もうすこし頑張りたいと思います。