AtCoder入水記事

## はじめに
水色になりました！
12月に緑になってから半年くらいかかりました

![atcoder_cyaan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983542/18a8c168-5ef4-459f-dc25-f1ce5df24cb3.png)

## やったこと
### 問題を解く
- ABCの緑~水diffの過去問題を解く
    - 苦手な問題も何問か解くと少し慣れますね
- [EDPC](https://atcoder.jp/contests/dp)を進める
    - DPはよく出るので、少しやるだけでもABCで役立ちます
- [競プロ典型90問](https://atcoder.jp/contests/typical90)の★4〜5問題をやる
    - ★4は全て埋まりました、とても学びが多いです

### 読んだ本
- [アルゴリズム的思考力が身につく！ プログラミングコンテストAtCoder入門](https://www.amazon.co.jp/%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E7%9A%84%E6%80%9D%E8%80%83%E5%8A%9B%E3%81%8C%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%8F-%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%B3%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88AtCoder%E5%85%A5%E9%96%80-%E5%A4%A7%E6%A7%BB-%E5%85%BC%E8%B3%87/dp/404604408X)
    - 主に緑になるまでに読んでいました
    - プログラミング初心者でも本当にわかりやすく読めます
- [競技プログラミングの鉄則](https://www.amazon.co.jp/%E7%AB%B6%E6%8A%80%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE%E9%89%84%E5%89%87-%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E5%8A%9B%E3%81%A8%E6%80%9D%E8%80%83%E5%8A%9B%E3%82%92%E9%AB%98%E3%82%81%E3%82%8B77%E3%81%AE%E6%8A%80%E8%A1%93-Compass-Books%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E7%B1%B3%E7%94%B0/dp/483997750X)
    - フルカラーで解説もとてもわかりやすいです
- [プログラミングコンテストチャレンジブック](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%B3%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8%E3%83%96%E3%83%83%E3%82%AF-%E7%AC%AC2%E7%89%88-%EF%BD%9E%E5%95%8F%E9%A1%8C%E8%A7%A3%E6%B1%BA%E3%81%AE%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E6%B4%BB%E7%94%A8%E5%8A%9B%E3%81%A8%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF%E3%82%92%E9%8D%9B%E3%81%88%E3%82%8B%EF%BD%9E-%E7%A7%8B%E8%91%89%E6%8B%93%E5%93%89/dp/4839941068)
    - 途中までしか読めて無いです、ちゃんと読みたい

## 主に学んだこと
思いつくものを書いていきます
それに関する問題もいくつか付けました
### 整数
#### フェルマーの小定理+繰り返し2乗法
- mod上での割り算に使います
- ACLのmodintを使えばこれを知らなくてもなんとかなるみたいです
- [ABC145 D - Knight](https://atcoder.jp/contests/abc145/tasks/abc145_d)

#### エラトステネスの篩
- 言わずと知れた素数を求めるアルゴリズム
- その数を割った最小の素数を記録しておくと素因数分解がO(logN)で出来ます

### DP
#### ダブリング
- 2\^n移動した時にどこにいるかをDPで求めます
- [ABC167 D - Teleporter](https://atcoder.jp/contests/abc167/tasks/abc167_d)
- [ABC179 E - Sequence Sum](https://atcoder.jp/contests/abc179/tasks/abc179_e)

#### 確率DP / 期待値DP
- ある状態からある状態に変わる確率や期待値をそれぞれ求めていきます
- [ABC298 E - Unfair Sugoroku](https://atcoder.jp/contests/abc298/tasks/abc298_e)
- [ABC280 E - Critical Hit](https://atcoder.jp/contests/abc280/tasks/abc280_e)

#### 桁DP
- それ以下であることが確定しているかを確認ながら遷移します
- [ABC117 D - XXOR](https://atcoder.jp/contests/abc117/tasks/abc117_d)
- [ABC154 E - Almost Everywhere Zero](https://atcoder.jp/contests/abc154/tasks/abc154_e)

### 二分探索 / 三分探索
#### 二分探索
- 出来ると出来ないの狭間を二分探索
    - [ABC174 E - Logs](https://atcoder.jp/contests/abc174/tasks/abc174_e)

#### 三分探索
- 凹んでるところを三分探索
    - [ABC279 E- Freefall](https://atcoder.jp/contests/abc279/tasks/abc279_d)
- yukicoderで三分探索しようとすると誤差でダメな問題に出会って泣きました
    - [yukicoder No.306 さいたま2008](https://yukicoder.me/problems/no/306)

#### セグ木
- 区間の最大値、最小値、和などをO(logN)で求められます
- ACLに頼って自作をまだしていないです、今度ちゃんと作って理解を深めたい
- [ABC185 F - Range Xor Query](https://atcoder.jp/contests/abc185/tasks/abc185_f)

#### Union-Find木
- Union-Findは併合は出来ても分割が出来ないことが弱点です
- 逆からシミュレーションするとグループの分割を併合として扱えます
- [ABC229 E - Graph Destruction](https://atcoder.jp/contests/abc229/tasks/abc229_e)
- [ABC264 E - Blackout](https://atcoder.jp/contests/abc264/tasks/abc264_e)

### グラフ
#### DFS
- 再帰関数を使って探索します
- [ABC213 D -  Takahashi Tour](https://atcoder.jp/contests/abc213/tasks/abc213_d)

#### BFS
- queueを使って探索します
- DFSよりBFSの方が使う場面が多い気がします、最短距離で使いがちなので
- [ABC211 D - Number of Shortest paths](https://atcoder.jp/contests/abc211/tasks/abc211_d)
- [ABC224 D - 8. Puzzle on Graph](https://atcoder.jp/contests/abc224/tasks/abc224_d)

#### Dijkstra法
- 重みのある辺がある時に使います
- 昇順に取り出すpriority_queueを使うので↓を書いておくと便利です
```cpp
template<class T>
using min_priority_queue=priority_queue<T,vector<T>,greater<T>>;
```

#### 01-BFS
- 辺の重みが0か1の時に、dequeを使って探索します
- logは取れますが、Dijkstraでも間に合います
- [ARC005 C - 器物損壊！高橋君](https://atcoder.jp/contests/arc005/tasks/arc005_3)

#### ワーシャルフロイド法
- 全ての頂点間の距離をO(N\^3)で求められます
- [ABC208 D - Shortest Path Queries 2](https://atcoder.jp/contests/abc208/tasks/abc208_d)

#### トポロジカルソート
- uからvに向かう辺がある時、uがvより先に来るようソートします
- サイクルの検出にも使えます
- [ABC216 D - Pair of Balls](https://atcoder.jp/contests/abc216/tasks/abc216_d)

## お役立ち情報
### [atcoder-cli](http://tatamo.81.la/blog/2018/12/07/atcoder-cli/)
テストケースの実行と提出がコマンドライン上で簡単に行えてめちゃめちゃ便利です

### [AtCoder Library](https://atcoder.github.io/ac-library/document_ja/index.html)
いろんなアルゴリズムをAtCoder側でライブラリとして提供してくれています
yukicoderでも使えるみたいです

### 拡張機能
- [AtCoder Easy Test v2](https://greasyfork.org/ja/scripts/433152-atcoder-easy-test-v2)
    - コードの提出の前に簡単にテストを実行できます
- [AtCoderLanguageButtons](https://greasyfork.org/ja/scripts/421663-atcoderlanguagebuttons)
    - 提出言語を簡単に切り替えられるボタンを追加します
    - 自分は基本C++ですがたまにPythonも使うので助かります
- [atcoder-difficulty-display](https://greasyfork.org/ja/scripts/397185-atcoder-difficulty-display)
    - 問題のdifficultyをAtCoderのページで表示してくれます
- [ac-predictor](https://greasyfork.org/ja/scripts/369954-ac-predictor)
    - コンテスト中にパフォーマンスを予測してくれます
- [AtCoderStandingsAnalysis](https://greasyfork.org/ja/scripts/398439-atcoderstandingsanalysis)
    - 順位表のページに問題ごとに通した人の数やペナ率などを集計した表を追加してくれます
- [Time Limit Emphasizer](https://greasyfork.org/ja/scripts/406381-time-limit-emphasizer)
    - 実行時間制限が2秒じゃない時に赤文字で強調してくれます
- [ac-rating-icon](https://greasyfork.org/ja/scripts/444140-ac-rating-icon)
    - レーティングに対応したアイコンを付けてくれます

### 便利なサイトなど
- [AtCoder Problems](https://kenkoooo.com/atcoder/)
    - 神
- [AtCoder Companions](https://atcoder-companions.kakira.dev/)
    - 自分と同じテストケースで落とされた人がどう修正してACしたのかを調べてくれます
- [AtCoder Rating Simulator](https://atcoder-rating-simulator.dt.r.appspot.com/)
    - どのくらいのパフォーマンスでどのくらいレーティングが上がるのかを可視化してくれます
- [GRAPH × GRAPH](https://hello-world-494ec.firebaseapp.com/index.html)
    - グラフ問題の入力例を可視化してくれます

## おわりに
次回のABCで緑に戻ってしまう気しかしませんが、[AtCoder Junior League](https://atcoder.jp/contests/ajl2023)もあるので頑張ります

## 追記
青になりました → [入青記事](https://qiita.com/kogetsu0728/items/0c07e1aa8af354cbc37f)