社会人1年目がAtCoderで水色になるまでにやったこと


この記事は[競プロ Advent Calendar 2021](https://adventar.org/calendars/6713) 4日目の記事です。

#この記事を書いている人と記事の内容について
初めまして、[まーぼー](https://atcoder.jp/users/N1flheimr)です。
以前行われた[ARC129](https://atcoder.jp/contests/arc129)で、**<font color='cyan'>水色コーダー</font>**の仲間入りを果たしました。やったね。
![入水5 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508545/fd3d6130-212d-accc-8cd4-ff2dcc6a06b8.png)

この記事では、私がAtCoderで**<font color='cyan'>水色</font>**になるまでにやったことをまとめます。

#目次
[1.AtCoderを始めた当初の私のスペック](#1atcoderを始めた当初の私のスペック)
[2.緑になるまでにやったこと](#2緑になるまでにやったこと)
[3.水色になるまでにやったこと](#3水色になるまでにやったこと)
[4.参考](#4参考)
[5.おわりに](#5おわりに)

##1.AtCoderを始めた当初の私のスペック
- 情報系学部卒
- 社会人1年目、SE
- C言語のポインタ渡しや再帰関数はなんとなく理解している
- 数学ができない

同じレート帯の中では**実装が強めで数学ができない人**という位置になると思います。

##2.緑になるまでにやったこと
- C++を覚える
- C問題以下を埋めて、**AtCoderでは何が問われてどのような技術が要求されるか**を理解する
- 組み合わせの考え方を理解する

C問題や簡単なD問題を埋めて、**計算量改善の感覚を掴む**ことが一番大事だと思います。

##3.水色になるまでにやったこと
効果が強かったと思う取り組み内容には**頭に★**が付いています。

###★過去問を埋める
**この問題を埋めることで自分は何を得たいのか**といった**目的意識**を持っていると、
精進効率が格段に上がる印象があります。
私は綺麗な実装方針で綺麗なコードを書くことを大事にして過去問を埋めていました。
参考までに、**<font color='green'>緑</font>⇒<font color='cyan'>水色</font>**になるまで700時間程かかりました。

###★傾向と対策をする
コンテストに出ている中で、**自分が苦手な問題の傾向**が見えてくることがあると思います。
私の例を1つ挙げると、迷路の問題でよく配列外参照を起こしていました。
問題例:https://atcoder.jp/contests/abc007/tasks/abc007_3
これについては**ライブラリを作る**ことで解決しました。
使用例を下に貼っておくのでよければ使ってみてください。

```C++:迷路の外側を#で埋める.cpp
#include <bits/stdc++.h>
#define rep(i,n) for(long long i=(long long)(0);i<(long long)(n);i++)
using namespace std;
int main() {
    long long h,w; 
    cin>>h>>w;
  	vector<string> str(h+2); 
    rep(i,h) cin>>str[i+1];
    rep(i,w+2) str[0]+='#'; 
    rep(i,w+2) str[h+1]+='#';
    rep(i,h) str[i+1].insert(str[i+1].begin(),'#');
    rep(i,h) str[i+1].push_back('#');
    rep(i,h+2) cout<<str[i]<<endl;
}
```
これを使うと、こんな入力が

```
4 4
.#.#
#.#.
.#.#
#.#.
```
str内ではこうなります。

```
######
#.#.##
##.#.#
#.#.##
##.#.#
######
```

このライブラリを正しく使用すれば、**配列外参照を起こさなくなります**。
自分に合ったライブラリを作成して、**コンテスト開始前から優位に立っていきましょう**。

###★目標を上げる
私はレート1200を目標に長らく競技プログラミングに取り組んできましたが、
**パフォーマンス1200をずっと取り続けたとしても、レートが1200になるまでは時間がかかる**
ことに気付きました。
仮に目標とするレーティングの数値があるのであれば、
**目標とする平均パフォーマンスはその数値よりも少し上**に設定することがおすすめです。

###★IDEを導入する
100回コンテストに参加しているうち、前半の80回程はprintfのみでデバッグを行っていました。
**IDEのデバッグは<font color='FF0000'>非常に強力</font>です**。
**<font color='green'>緑上位</font>**(レート1000)以上を目指すなら導入することをおすすめします。

###★コンテスト(ABC,ARC)に毎回出る
私は**コンテスト時間中の集中度合いとコンテスト外で過去問を埋める時の集中度合いが大きく異なる**
ため、コンテストに数多く出て**深く集中する時間を増やし**ました。

###★Codeforces(Div2,Div3)に出る
同じくコンテストに多く出てより**深く集中する時間を増やし**ました。
また、AtCoderのレートが伸びない時でもCodeforcesのレートは伸びて**<font color='blue'>青色</font>**になったこともあり、
競技プログラミング自体の**モチベーション維持**に役立ちました。

###★バチャに出る
好きな過去問を好きな時間に埋めるという行為は**時間に追われない**ので、
**コンテスト中とはかなり条件が異なります**。
バチャに出ることで制限時間のある環境での練習ができます。

####生活習慣を固定する
コンテスト開始5分前に目覚めて、**コンテスト中に全然頭が回らない**ことが何度かありました。
検討の結果、コンテストのある日は14時に起きて18時までに夕食を済ませ、
20時前にエナドリを飲み、21時前まで運動して血圧を上げてコンテストに参戦するという
**謎の専用ルーチン**が完成しました。
ここまでする必要はないと思いますが、
**少なくとも20時前後には起きていた方が良いパフォーマンスが出ると思います**。

####Google Chromeの拡張機能を入れる
**入れるだけでパフォーマンスが上がる**拡張機能があると私は思っています。
[AtCoder Clans](https://kato-hiro.github.io/AtCoderClans/scripts#gsc.tab=0)で自分に合ったものを見つけましょう。

####Twitter
自分と同じくらいのレートの人をフォローすると、**モチベーションの維持**に繋がります。
コンテスト後に**自分が想定しなかった解法**をつぶやいてくれることも多く、学びがあります。

##4.参考
####水色になった今の私が大体理解しているアルゴリズムとデータ構造

|   |   |   |   |
|---|---|---|---|
|全探索|二分探索|深さ優先探索|幅優先探索|
|動的計画法|ダイクストラ法|ワーシャルフロイド法|クラスカル法|
高速な素数判定法|べき乗の高速な計算|逆元の計算|累積和・いもす法|
座標圧縮|半分全列挙|最大流|最小カット|
|グラフ理論|木|Union-Find|セグ木|

####水色になった今の私が理解していないアルゴリズムとデータ構造

|   |   |   |   |
|---|---|---|---|
|行列累乗|ダブリング|Grundy数|Rolling Hash|
|平方分割|二部マッチング|二部グラフ判定|


##5.おわりに
記事を書き終わって気付きましたが、
**実力UPに強く効果のあるものはやはりどれも時間がかかりますね**。
AtCoder **<font color='blue'>青色</font>** を目指す気になったら帰って来ますので、その際はまたよろしくお願いします。
最後までご覧いただき、ありがとうございました。
それでは皆様、良い競技プログラミングライフを。