sankantsuのブログ

技術メモ・競プロなど

AtCoder で水色になった

初めてコンテストに参加してから2ヶ月半,13回目のコンテスト参加で水色レートを達成することができた. AtCoder で当初からひとつの目標としていた水色に到達したので,やってきたことなどをまとめてみたい.

レート遷移

時系列振り返り

参加開始当初の状況

情報系の修士2年生で,授業, 実験, 研究, 趣味などでもともとそこそこのプログラミング経験はあった. 使っていた言語は主に C/C++, Python. 他に Lisp, OCaml あたりも少し触る程度.

Pythonは学部1年のときに授業で習って以降,実験データの整理や作業用のちょっとしたスクリプトを書くのに使っていた.

大学の授業でC言語は勉強していたもののC++は扱わなかったので,学部3年のときに本を借りて少し勉強していたが本格的に使うことはしばらく無かった. 修士研究を進める際,先行研究の実装がC++で書かれていたので,これを読んだり拡張したりする目的で改めてC++を勉強し直した.

競プロについては学部3年のころから存在は認知していて,興味は少しあったものの参加したことはなかったし,どういう問題が出るかも知らなかった. 今年になって,就活で課されるコーディング試験の練習も兼ねてやってみることにした.

開始直後の頃

競プロでは実行時間の速い言語が有利と聞いていたので,基本的にC++を使っていくことにした.

コンテスト参加を本格的に考え始めたのは2月ごろ. とりあえず AtCoder Beginners Selection をやってどんな問題が出るのか見てみることにした.

その後,初参加は少し遅れて3/20のABC244. 結果はA-Dの4完で871の緑パフォ.(あとで確認したところ,この回はD問題まですべて灰diffだったらしい)

参加し始めた当初は実際緑コーダーぐらいの実力だったのではないかと思う.

緑になるまで

コンテストに参加し始めた後は知識不足を埋めるため一気に勉強を進めた. 主に用いたのは次の3つになる.

このころは,まだ典型知識の不足や実装経験の不足がかなり感じられたので,あまり自力で解くことにはこだわらず解説はどんどん見るようにしていた.

まず蟻本を中級編までざっと読んだ. きちんと実装までやっていないものも多くあるが,典型的なアルゴリズムを吸収する上でかなり役にたったと思う.

その後は典型90に取り組み,3/29までで★4以下すべて,4/3までで★5までをすべて埋めた. 典型90もわからない問題が結構あったので,解説ACはかなり多い. 蟻本で読んだアルゴリズムの実践という意味合いと,蟻本でカバーされていない典型知識を身につけるのに大いに役に立った.

その後は典型90の★6以降をやるにはまだ早いと感じていたので,初中級者が解くべき過去問精選 100 問に取り組むことにした. 典型90もこちらも教育的な問題がよく集められていると感じていて,このような題材を準備してくれた E869120 さんには本当に感謝したい.

蟻本や典型90でだいぶ経験を積む中で,過去問精選100の問題はかなり自力で解ける部分が多くなっていた. 復習もかねて適度な難易度の問題をたくさん解けたことはアルゴリズムの定着につながったと思う,

実戦経験の不足もあり結果が出ない回もあったが,レートは徐徐に上がっていき6回目の参加で緑レートに達した.

実は,緑に上がったあとよりも上がる前のほうが精進量は断然多い. すぐに結果が出たわけではないが,このころベースとして身につけた知識はその後レートを伸ばしていく中でかなり大きな推進力になっていたと思う.

水色になるまで

この頃は,修士研究の中間発表の準備や就活の面接等があり,以前ほど多く過去問を解くことはなかった. ときどき時間があるときに精選100問を解いていて,5/15にすべての問題を埋めた.

コンテストには毎週参加していて,時間内に解けなかった問題を1問は解説見てもいいのでできる限り解くようにしていた. この作業を通して青diffぐらいの問題にもいくらか向き合うようになったので,地力の向上につながったと思う.

コンテスト自体への慣れもあって少しずつレートはあがり,6/4のABC254にて水色レートを達成することができた.

競プロをやって良かったこと

まず,単純にコンテストに参加することは面白いと思うので,趣味として楽しめている.

実用的な面としては,競プロへの参加を通してアルゴリズムへの理解や実装力を向上できた点がある. 勉強したアルゴリズムの中には授業などで知っていたものもいくらかあるが,実装経験は不足していた. これらのアルゴリズムについて,競プロの問題を題材に実装することで理解が深まったと思う. また,アルゴリズムに限らずとにかく全体的に実装が速くなった.

今後

次は青色を目指したいと考えている. 水色までは比較的順調に上がってこれたが,現状青パフォは1回しか出せておらず,このまま漫然とやっていて青に上がれるかは微妙な気がしている.

これから強化していきたい部分は次の3つである.

  • 典型知識の強化
  • ライブラリ,ツール整備
  • 速解き
  • 考察力

まず,典型知識について. 基本的な部分はそれなりに身についてきてはいると思うが,まだまだ不足はある. ABCのF問題に出てくるぐらいのレベルのをだいたい網羅しておきたいと思う. まずは典型90の★6を埋めたい.

ライブラリ,ツール整備について. アルゴリズムなどをその場で素早く実装できる力を身につけたいと思っていたこともあり,現状ライブラリはあまり整備していない. ただやはりセグメント木など有名なデータ構造などはライブラリ化することでコンテスト中の時間的なメリットはかなり得られると思うので,頻出のものだけでも少し整備してみたいとは思っている. ライブラリ整備自体で理解が深まるところもあるのではないかと考えている. また,コンテスト中のテストなどを素早く行うためのツールを整備しておきたい.

速解きについて. 最近,コンテスト本番でB,C問題あたりで実装に意外とてこずって時間をかなり消費したりペナルティを食ったりしているケースが多い. 素直な実装をすばやく行うという面で経験値としても意識としても足りない部分があるので改善していかないといけない. 下埋めの精進はあまりしてこなかったが,一度集中的にやってみるのもありかもしれない.

考察力について. これまでABCでは比較的順調に成績を伸ばしてきたが,実はARCでは2回参加して両方わずか1完と惨敗している. AtCoder Problems で diff として同じぐらいとして表示されている問題でもABCとARCだとARCの問題のほうがかなり苦戦する傾向にある気がしている. ABCは知っていれば解けるたぐいの問題が比較的多いが,ARCのほうがアドホックな考察が必要なことが多いからではないかと感じる. 今後はARCの問題なども練習して考察力を身につけ,ARCでも成績を出せるようにしていきたいと考えている.