どうでもいい前置き
競技プログラミングというのを最初に知ったのは、今は昔の話で10年近くも前になるだろうか。A問題とB問題くらいしか解けず、かといってアルゴリズムを勉強してCやD問題を解くことはなかった。たまに存在を思い出しては参加して、簡単な問題を解いて終わるということを繰り返していた。
転職もしたいし、プログラミングの勉強にもなるだろうということでAtCoderに本格的に取り組むことにした。記録を見ると、前は2023年6月頃に取り組み始めて11月頃には止めたらしい。そして、2024年5月に熱意が再燃した。
ちなみにプログラミング言語はC++で、エディタはNeovim、コンパイラはg++を使用している。どれも機能をまったく使いこなせていない。
まずは茶色を目指すぞ~
AtCoderの最高レーティングは404(2023年11月4日時点)で茶色の8級が最高到達点だ。もちろん、夢は大きく赤色のレッドコーダーであるが、それは遥か夢の彼方というわけで、まずは茶色に戻るところからだ。Rated参加登録をしたものの参加しないということが何回かあり、レーティングが劇的に下がってしまった。現在(2024年6月12日時点)のレーティングは313で灰色。
コンテスト成績表のパフォーマンスを見るに、きっとレーティング500くらいの実力はあるだろう。1回あたり20程度は上がりそうなので、5回くらいコンテストに参加すれば茶色に成れそうだ。
コンテスト参加準備
他の参加者の方々が、どんな風に準備をして参加しているのかはあまり存じ上げない(調査して参考にした方がいいいんだろうけど、まあ、それはいずれ)。
ソースファイルのテンプレ
こんな感じのテンプレを a.cpp ~ d.cpp として用意している。きっと、#include <bits/stdc++.h>
と書いた方がいいんだろうし、少なくともstringやvector、map、setなどよく使うヘッダーファイルはインクルードするよう書いておいた方がいいんだろう。でも、不要な記述はなるべく減らしたい派なので必要になったらインクルードする方針にしている。整数型もlong longを使用するのがいいんだろうけど、必要なければintを使用している。
前はusing namespace std
を記述するのも邪道だと考えていた時期もあって、その頃はちゃんとstd:
を記述していた。
#include <iostream>
using namespace std;
int main()
{
return 0;
}
コンパイル
コンパイルは下記のコマンドをターミナルに打ち込んでいた。これをいつも直打ちするのはスマートではない気がするので、少しずつ改良していきたい。
$ g++ -o a a.cpp
Neovimの設定
なんか Vim ってカッコいいよね、という意識で使っている。特に拘りが無ければ、Visual Studio Codeを使用するのがいいと思う。
カラースキーマを入れたり、vim-airlineでステータスラインをカッコよくしている以外、特にカスタマイズはしていない。いつか別の記事で、Neovimの設定を勉強がてらまとめてみようかな。
修行
問題集を読んで、ひたすら解いていた。後は、AtCoder ProblemsでABCのAB問題を消化していった。何問かに一回くらい知らなかった有用な関数などを知れるので、B問題を解いていくのは有用だったと思う。
そして実戦へ
目標
- C問題を時間以内に解き切ること
- レーティング : 400
コンテスト | パフォーマンス(目標) | パフォーマンス(実際) | 新Rating |
---|---|---|---|
ABC358 | 500 | 620 | 343(+30) |
ABC359 | 520 | 811 | 396(+56) |
ARC180 | 500 | 904 | 459(+63) |
パフォーマンス(目標)は、毎週成長していることを願ってる程度の適当な数値。ARCは参加しない方が無難だとは思うけれど、A問題でも解けたらレーティングが上がるだろうから参加することに。
というわけで、茶色になりました
上の方々が優秀過ぎるだけで、茶色だって誇っていいと思うんだ(`・ω・´)。最近あまり見ないよね、顔文字。古いのかな、好きなんだけど。
整数と文字列に関して基本的な操作が自由にできて、基本的な全探索ができれば茶色になれる気はする。C++でいえばvectorとstringに関して基本的な操作ができて、algorithmヘッダーのsort()や、cctypeヘッダーのto_lowerとか基本的な関数の知識を徐々に積み上げていくことで到達できるんだろう。
二分探索、グラフ、累積和やDFSとかは茶色から緑になる過程で必要になっていく感じがする。
では、次は緑色になった際に。
おすすめ書籍
アルゴリズム的思考力が身につく! プログラミングコンテストAtCoder入門
中級編までやれば茶色には成れると思う。練習問題の中には何日か掛けて解いたものもあったりして、真面目に自力で解こうとすると時間は掛かる。スマートな取り組み方もあるんだろうけど、私は愚直に練習問題を解答を見ずにウンウン悩んで取り組みました。
いい解法が思い浮かばなかったり、エッジケースに詰まると、つい解答を見たくなってしまうけれど、エラーを自力で解決する力というのは、実際に独力で問題解決する中で身に付く気がする。
ちなみに、まだ中級編を読み終えていません。(-_-;)
参考記事