AtCoder青になるまでやったこと・やらなかったこと

## 1. 概要

今までの取り組み内容を大雑把に書きます。
（他の色変記事に対して）特に目新しいことはないと思います。暇つぶしぐらいの気持ちで読んでいただければ幸いです。

## 2. 自己紹介

### 2.1 あなたはだあれ

- アラフォーのおじさんです。理系出身ですが、情報通信系ではありません。
- プログラミングは趣味で少し書ける程度でした。競プロ始める前はPythonを使って統計・機械学習の勉強をしたりしていました（なんか流行っていたので）。
- 競プロを始めたのはテレ東さんのYouTube動画を観たのがきっかけです。間違いなくハマる、と当時思いました。

https://www.youtube.com/watch?v=WGNQrH0AV2k

### 2.2 AtCoderの記録

AtCoderはID: [bo9chan](https://atcoder.jp/users/bo9chan)でやっています。
レーティングのグラフは入青時点のスクショを取り忘れました。ABC294で入青です。
![rating.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142452/7b63bd36-f5d5-22e1-fde8-e180ca1eea05.jpeg)

以下2つは入青時点です。
![achievement.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142452/2d4f8de6-ed39-535b-a94a-22b7f0122ce6.jpeg)
![diff_pies.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142452/d365c69f-06f9-5081-4cfa-583c8e37be83.jpeg)

## 3. やったこと

### 3.1 問題をたくさん解く

入水までは比較的スムーズに行きましたが、2022年の2月ぐらいからレーティングが伸びなやんでいました。同年8月に再開した時も成績が芳しくなかったため、レーティングではなく解いた問題の数（AC数）で上位を目指そうと思いました。理由は

- AC数はレーティングと違い絶対減らないので、モチベーションの維持につながる
- 一度解いたことのある問題の復習は正直楽しくない
- [AtCoder Problems](https://kenkoooo.com/atcoder/#/table/)のマス目を埋めていくのが気持ちいい

といったところです。まあこのやり方が自分にとって一番楽しんでやれたというところが大きいです。結果として、世界で250番目くらいにAtCoderの問題を多く解いた人になりました。
なお、主に以下の問題セットを解いています。

- ABCの青diff以下。試験管[^1]は黄diffも
- ARCの試験管 C問題まで
- PAST全範囲
- 競プロ典型90問 ★6以下
- Educational/Typical DP Contest

[^1]: ABC001 ~ 041のこと。ARCは001 ~ 057。

また、[「問題解決力を鍛える!アルゴリズムとデータ構造」](https://www.kspub.co.jp/book/detail/5128442.html)（けんちょん本）とE869120さんの[精選100問（中級）](https://qiita.com/e869120/items/eb50fdaece12be418faa)、[50問（上級）](https://qiita.com/e869120/items/acba3dd8649d913102b5)には大変お世話になりました！！

### 3.2 数学の勉強をする

情報系ではないので、競プロを始めた当初は二分探索すら知りませんでした。アルゴリズムはけんちょん本で勉強しましたが、数学についても代数（modとか）やグラフ理論の知識がなかったので、茶～緑コーダーぐらいの時にネット上の大学の講義ノートや市販の教科書、早水先生のYoutube動画で勉強をしました。

https://www.youtube.com/watch?v=d0KPWURyFIs&list=PLCo60G1m_ibpJgfB4WcGwWybC6sfyawoL

### 3.3 テンプレート・ライブラリの整備

競プロではC++を使っていますが、自作のテンプレートを用意し、そこにコーディングしています。例として、

- `rep`等のマクロ
- `std::vector`や`std::pair`の加減乗除、入出力等（下図）
- プリントデバッグ用の出力関数
- 切り上げ除算、等差数列の和、nCrなどの便利関数

などをファイルの冒頭につらつらと200行以上書いています。極力コーディング量を減らして実装の負荷を軽くするのが狙いです。
![template.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142452/a82aca01-1e87-e9a0-c30c-e17b08c7529d.jpeg)

また、別途ライブラリを整備しています[^2]（下記）。どんなメンバ関数を持たせるかを考えるのが楽しいので、過去問精進に飽きた時はよく作ってました。

【作った 
or パクった
ものたち】
基数変換/ベルマンフォード/BFS/組み合わせ/座標圧縮/累積和/カレンダー/DFS/ダイクストラ/ダブリング/階乗進法/フェニック木/幾何/HLD/平方分割/LCA/LIS/行列/Mex/素数/有理数/ローリングハッシュ/Sparce Table/トポロジカルソート/Treap/トライ木/フロイド・ワーシャル/ウェーブレッド木

[^2]: [AtCoder Library (ACL) ](https://github.com/atcoder/ac-library) にあるものは自作せず利用させてもらっていますが、フェニック木（BIT）については二分探索の機能がないため、「[AtCoder黄色を目指してやってきたこと](https://qiita.com/hamamu/items/2e342d46d9f54732d42c#bitbinary-indexed-tree%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9)」の記事などを参考に自作しています。

### 3.4 自分用に解説を書く

初めて勉強したアルゴリズムは、書籍やネット記事があるだけでも大変ありがたいのですが、やはり自分の言葉で書くのが後々見返すときに再理解しやすいので、大学ノートやScrapbox（下図）に書くことがあります。

![scrapbox.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142452/188ea0ca-0fe4-cc4a-98c1-cad057fffe49.jpeg)


## 4. あまりやらなかったこと

### 4.1 バーチャルコンテスト

コンテスト直後にやる復習（解きなおし、別解確認）は別として、一度解いた問題を復習するのはあまり楽しくないし、AC数も稼げないのであまりバーチャルコンテストには出ていません。出たほうが効率的に身につくとは思うのですが、自分が楽しいかどうかを優先した結果、未AC問題をひたすら解くようになりました。

### 4.2 ARCへの参加

ABCに比べて問題が苦手である、日曜夜に1時間半も椅子を温め続けて辛かった、ABC系の過去問精進で手いっぱいでARCまで手が回らない、等、言い訳すればキリがないですが・・・。

### 4.3 問題を毎日1問以上解く

いわゆる「Streakをつなげる」というやつですが、競プロをやりたくない時はやらない方が競プロを続けられると思ったので、そのような縛りは自分には課さないようにしていました。（無論それ自体を否定するものではありませんし、何年も続けている方々は本当にすごいと思います）

## 5. さいごに

最近は試験勉強その他諸々で全然精進できていませんが、競プロは長く楽しく続けることを目標にしてきたので、これからもそんな感じで行きたいと思っています。最後まで読んでいただきありがとうございました。