AtCoderで黄色になるまでにやったこと2019-07-02AtCoderで黄色になるまでにやったことプロコンAtCoderを始めて2年5か月くらいで黄色になった。AtCoderを始めるまでプログラミング歴はとても長くC++が好き、数学も難しいことはわからんけど適当でいいならできるという感じで、相当にAtCoder向きな能力セットを持っていた。AtCoderの存在はけっこう前から知っていて、一度はやりたいと思っていた。直近のABCを解いたうえで、2017/1/28のABC053に初参加。思いがけず問題の質が高く、継続してコンテストに参加することとなる。モチベ健康のために数学っぽいことをしたいと思いつつ何もしない期間が長かった。その意味でAtCoderは渡りに船だった。プログラミングは得意だから障害にならないし、数学パートもけっこういい加減でよくて今の(当時の)自分でも気楽にできる。最初のころは、提出の実行時間や使用メモリがずらずらと表示されているのを見るだけで楽しかった。そのうちレーティングを気にするようになり、悔しがったり落ち込んだり何も感じなかったりしていた。今の自分がこれだけ感情を動かされることをやっている、それはとてもいいことだと思った。家にいながら緊張したりウンコしたくなったりなるのすごいよね。半年くらい前に気づいたけど体温まで上がるようになってた。面白そうな問題があれば解きたいと思い、順位表があれば勝ちたいと思う性格だったので、コンテスト中はそれなりに集中できたのだ(コンテストの時間は100分とか120分とかで、そのくらいなら)(あまり集中できない回もあった)。参加して普段と違う空気の中で考える価値が非常に高いと思っていた。いうわけで、基本的には自分の数学方面の力を維持する(または低下をゆっくりにする)ためにやっている。「レーティングは集中するためのエサに使ってるだけでどうでもいいんですよ」とか表面上は言う。やったこと勉強方法コンテストに出て復習が基本。最初のころは、過去問(ATC001とか)をやって周辺知識をネットで検索する感じで典型知識を増やしていった。1年くらい経つとyukicoderのコンテストにも出るようになった。AtCoderの問題は難易度によらずめちゃくちゃ親切なので、yukicoderで普段と違う筋肉を鍛えたいという意図もあった。なんだかんだ面白い問題あるし、たまに知らないド典型が出る。復習の具体的な中身は、コンテスト中に挑戦したけど解けなかった1問を解くこと(王道)と、解けた問題を納得行くコードで再提出(納得ポイントは、コードの見た目のきれいさと実行速度)。考えて進展がなければすぐ解説を見る(だらだらと考えちゃうこともあるけどあんまよくない)。最近特に心がけていたのは、やりたくないことはやらないということ。それで放置された問題もたくさんあるが、それでいい。苦しみながら進めるほど簡単な道のりではないはずだ(それっぽいことを言う)。僕個人については、練習によっていまさら地頭が付くはずがないと思っている。そんな中でも難問を解けるようになるための方法は存在して、それが「簡単な問題を瞬殺できるようになること」。10分かかったことが1分で、1分かかったことが1秒で、1秒かかったことが0秒でできるようになれば、思考の質は変わる。難問を解くための練習は難しくても、簡単な問題を解くスピードを上げる練習ならいくらでも考えようがある(前述の「納得行くコードで再提出」がそれかな(あんま深く考えてなかったけど))。コンテストに参加するのが、練習としてはコスパが良すぎる。最近知ってびっくりしたんだけど、ABC132が終わった時点で参加回数(ratedコンテストのみ)が84回、これがAtCoder全体で40位タイなのだ。参加数上位には日本人しかいない。毎週普通に参加できてるのは思ったよりレアケースだった。ソリューションの中にプロジェクトを2つ入れて、片方でC++を書き、もう片方のサンプルケースでテストする部分はC#で書いた。Firefox+userChrome.jsで現在表示しているタブのサンプルケースが自動でダウンロードされるようにしてある。これにより、実行ボタンを押すだけでサンプルを実行し全て通ればソースコードをコピーしてFirefoxをアクティブにし提出欄にフォーカスを当てるようになっている(あまり完成度は高くないけど自分で使うぶんにはいいかなくらい)。サンプルの自動実行は非常に便利。そもそもコンテスト中の時間というのは集中して問題を考えることができる貴重なものであり、たとえ30秒でもサンプルのコピペに毎回使ってしまうのはもったいない。答えが複数ある問題の場合は、サンプルに対する出力が正しいか判定することはできないが、自分のプログラムの出力と出力例を並べて表示できるのでこれも便利。Studioのコードスニペットで、たとえばfor[Tab][Enter]とするとfor文が書ける。これを競プロ向きにカスタマイズした。v.end());が出てくるとか。自分は(あくまで競プロerとしてはだけど)タイピングがそれほど速くないので、重宝している。MSVCとgccでは挙動が異なることがある。int64_tの型が違うとか、includeが足りなくても動いてしまうとか。カスタムビルドツールでMinGWのgccを使っている。