みずくらげの競プロ記録

みずくらげです。競プロ始めました (2018. 01. 27)

水色になるまで

 

f:id:mizukurage01:20180916144901p:plain

先日開催されたAGC027で水色になりました!いい機会なので、忘れないうちにこれまでの経緯について書いていこうかなと思います。

(水色になるためにこうした方がいいとかではなく、あくまでも自分の辿ってきた道を中心に書いていこうと思います。あまり参考にならないかもしれませんが、もし興味があれば読んで頂ければと思います。)

 

簡単な自己紹介

みずくらげです。現在は大学4年生で、バクテリアを扱う研究をしています。プログラミング自体は2年の春休みに始めたので、歴は1年半ぐらいです。競技プログラミングは3年の春休み直前から始めて、それから7~8ヶ月ぐらいが経とうとしています。プログラミングを始めた経緯については話すと長くなるのでまた機会があれば...

あ、趣味は(競プロと)ラブライブです!このアイコンはヨハネと言います!!(聞いてない)(twitterのフォロワーさんいつもラブライブ関係のツイート流してすみません...)

 

競プロを始めた経緯

競技プログラミングの存在を知ったのがプログラミングを始めて少し経った春ですね。当時ある生物サークルに属していて、新入生を確保しようと奮闘していたのですが、かかったのは新入生ではなくあのMM赤のうさぎさんでした(!)。そんなことは微塵も知らない僕は、変わったうさぎだな(失礼)と思いつつも、話してみるとどうやらプログラミングに関するコンテストなるものがあって、それに参加しているようでした。当時他に熱中しているものがあったのですぐに始めることはなかったですが、こんな世界があるのかとかなり興味を持ったことは覚えています。(うさぎさんはプログラミングで分からないことがあったら相談にのると言ってくださった素敵なうさぎなので、僕はその厚意を利用していつか分からない問題を投げまくろうかと考えています())

丁度熱中していたものが一区切りついて時間に余裕ができたので、この出来事を思い出して(あと、アルゴリズムも知りたかったので)AtCoderなるものにとりあえず登録してみました。

 

初めてのABC参加

参加したコンテストはABC087でした。参加当時の実力としては、Pythonの文法は知っていてある程度自分の思うようにコードはかけるけど、アルゴリズムに関する知識はほぼ無かった状態でした。

結果はCまでを5WA 終了4分前に解いて、Dは考えられずに終わったという感じでした。(パフォーマンスが477、レートが24でした。)

f:id:mizukurage01:20180916184900p:plain

正直もう少しできると思っていたので、灰色の下の方に点がついたレートを見て(当時レートが初めは低く出ることを知らなかったこともプラスして)周りのレベルの高さに愕然としました。でも、それよりも久しぶりに高校や大学受験の時の面白い数学の問題を解いたような感覚が優っていて、もうこの時にはハマりかけていたのだと思います。

 

数回のコンテストを経て

慣れもあってかCも早く(早くはないですが)解くことができるようになって、Dを考える余裕ができたところで知識不足を実感しました。具体的には、自分で解けたと思ったコードに対してTLEがついた時ですね。その時にコードは正しく実装するだけでなく、計算量を落とす工夫をしなければならない(そのためには適切なアルゴリズムを実装しなければならない)ことを痛感しました。というか、解説見た時に累積和だったり深さ優先探索だったりと知らない言葉が次々と出てきて全く頭に入らなかったのでこれはアルゴリズムやらねばという使命感に駆られました。

 

螺旋本に手を出す

当時、競プロ用でアルゴリズムを学ぶ書籍として蟻本と螺旋本の二つを認識していました。中身を見る限り、アルゴリズムに対して項目別になっている螺旋本の方が、アルゴリズムを勉強したことのない僕には適しているかなと思い、手を出してみました。(この判断は今も適切だったと思っています。)

進め方としては、おそらく考えても知識がないので無駄と思って、問題を把握した後はすぐに解説を見て、AOJにある同じ問題を解くということを繰り返していました(章末問題は1週目は飛ばしていました)。解説を読んでも分からない時にはネットで分かる記事を探したり他の人のコード見たりしてましたが、たまにハマるときがあって時間をかなり費やしました。

僕の場合は特に連結リストと木、ヒープ、プリム法の理解に苦戦しました。最終的に、連結リストはプログラミング/11 - CourseWiki、木は何とか他の人のコードでわかりそうなものを一つずつ追って、ヒープはこの講義資料(リンク先)、プリム法はこのサイト(リンク先)があったのでこれで解決しました(でも、どこが分からないかは人それぞれなので、参考にならないかもしれません...)。

あと、いくつかPythonでは計算量的に通らない問題があったので、その場合にはPyPyを使うといいと思います。Pythonと同じコードで言語の選択を変えるだけで良いです。(僕はしばらく知らなかったので正しい実装が通らなくて辛かったです...)

他にも、再帰の深さがある回数を越えるとエラーになったりする(僕の環境では1000回まででした)のでimport sys  sys.setrecursionlimitで再帰回数の上限を変更する必要があるなどがありました。

 

進め方としては大体これでよかったと思いますが、一つ思ったのは、C++のコードを避けずに読めばよかったなと思います。C++の入出力が分かればPythonしか知らなくても意外と読めるし(もちろん分からない部分は調べながらですが)、C++アルゴリズム解説コードはネットに落ちてあることが多かったので、それだけでも詰まった時に解決できる手段が増えたのかなと思います。

結果的には、競プロにはソートや二分探索木などは標準ライブラリで事足りました(少なくとも現時点では)が、ソートを扱う上で計算量の概念を詳しくしれたり、ライブラリ内ではこのような動きをしているんだということが分かってためになったと思います。あと、純粋にアルゴリズムを知っていくのは何より楽しかったです。

初級編が終わったのが3月末で、3月中にはざっと一通り復習できたと思います。このあたりでレートは茶色の真ん中ぐらいでした。

 

蟻本に手を出す

その後もしばらく螺旋本を使って応用編や初級編の章末問題を解いていたのですが、おそらく(うる覚えですが)、けんちょんさんのAtCoder 版!蟻本 (初級編)の記事を見かけたことがきっかけで蟻本を解いてみたくなり、螺旋本から蟻本に移行したのだと思います。Eはまだ早いかなと思い、Dまでの問題を(全てではないですが)解いていきました。

螺旋本での学習の成果もあってか、問題の難易度が丁度いいと思えるようなもの揃っていたり、分からなくても蟻本やAtCoderの解説スライド、他の人が書いてくださっている解説などなど充実していたので、時間はかかることもありましたが大きく詰まることはなかったように思います(何度も言いますが、全ての問題を解き切った訳ではないです。)

4月~5月半ばは研究や他のこと(英語など)に時間をかなりかけていたのであまり精進しませんでしたが、(レートが冷えたこともあって)精進欲が湧いてきて、6月初めにはざっと一通り最後まで解きました。この時点でレートは緑半ばぐらいです。まだコンテスト中に全完はできていなかったものの、感覚的にはDもいつ解けてもおかしくないぐらいでした。

AtCoder版!蟻本は本当に素晴らしい教材だと思います。項目ごとにまとまっているので成長が実感しやすいですし、良問が揃っているので自分で実装するところまでできるので使える知識になるし、リンクも充実していて詰まりにくいので。ほんとけんちょんさんに感謝!)

 

停滞期

6月後半から8月初めまではほとんどレートが伸びていません。院試勉強と研究にかまけて競プロしていなかったからですね。(僕のレートのグラフ見ると、精進していない期間と平らになっているところは見事に一致しています。あれ、そういえば早解き型の人はしばらく競プロやらないとすぐに落ちるって聞いたことが...

ただ、7月半ばに初めて全完が出ました。精進していなかっただけに素直には喜べなかったですが。

 

蟻本中級編スタート

8月から精進も再開し、今度は蟻本の中級編に手を出して見ることにしました。初級編の時はAtCoder版蟻本と蟻本を同時に進めていましたが、中級編はまず蟻本の問題と解説を先に見て、実装はせずに頭で理解していく方針で取り組みました(はじめは同時並行でやるつもりでしたが、読んでみると思ったよりかなり面白くて、早く先に進みたかったので自然にそのようになりました)。

8月末ぐらいに一通り読みました。正直半分ぐらいの問題しか理解することはできませんでしたが、それでも(使えるかどうかは別にして)考察に入れることのできるアルゴリズムの幅はずっと増えたと思います。

 

ゴリラジオ体操参加

prdさんが開催しているバチャに勝手に参加してみました。動機としては、Dあたりの問題を解くには、僕はすぐには解法が浮かばないのでしっかり考察する時間が必要なんですけど、一人で何となくやると集中してできていない時があって時間を消費してしまうので、コンテスト形式で短時間で集中してできる環境が欲しかったからです。

丁度そんな時に、ゴリラジオ体操がD問題も扱うと聞いたこともあって、参加してみました。

参加してみて思ったのですが、これかなりいいです。Dレベルの問題をコンスタントに解く習慣ができたことはもちろんですが、それだけでなく、早起きの習慣がついたことが個人的にはかなりプラスでした。朝弱いんですけど、バチャがあると思うと(すっぽかすこともありますが...)、二度寝してしまうことが格段に減りました。朝に精進するというのもいいですね。どこかで、1日の早い段階で精進すると自己肯定感が高まるとか聞いたことがありますが、これは真だなと思わされました(最低限のノルマ?は確保されているので、前向きに残りの時間を使えるという心理なのかなと思います)。

 

まとめ

こんな感じで、蟻本中級編とバチャを活用していった結果、水色にもなれました。実力としては400点のDであれば時間があれば正答率は半々かなという感じです。

今後はAtCoder 版!蟻本 (中級編)をどんどん進めていって、使えるアルゴリズムを増やしていきたいです。まだまだ伸びしろはある(ほんまか?)と自分は思っているので、成長できるように頑張ります!いつかオープンコンテストに出れたらいいなぁ。

(長々と書いてしまいましたが、読んで下さった方ありがとうございます。)

 

最後に

競技プログラミングを初めて常々思うのですが、競プロは本当に学びやすい環境が整っているなぁと感じます。それは、けんちょんさんを始めとした方々の分かりやすい記事であったり、twitterなどを通じた交流・質問をし合える環境、バチャなどの良質なサイトや、初心者にも配慮のあるコンテストなどなど、挙げればきりがないほどです。このような環境は今まで僕が体験してこなかっただけに、とても恵まれているなぁと本当に思います。今の環境を築き上げて下さった方々にはとても感謝していますし、いつか自分も何らかの形で貢献できればと思います。