【AtCoder】現役中学生がPythonで青になったから書いた記事

# 追記(2024/6/12)
いろいろ考え方変わってるから[こっち](https://halc-kyopro.hatenablog.com/entry/2024/06/11/203504)(入橙記事)の方を見てほしいです

# まえがき
こんにちは、Halcyonです。
先日開催された[AGC063](https://atcoder.jp/contests/agc063)にて<font color="blue">青色コーダー</font>に昇格しました。
![IMG_2012.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3359390/860a7782-4409-faf5-b63b-f02ddbdc189d.jpeg)
AtCoderの社長である[chokudaiさんのブログ](https://chokudai.hatenablog.com/entry/2019/02/11/155904)によると、青色コーダーのレベルは
>* 学生時代を競技プログラミングに注ぎ込んでも、ここにたどり着けない学生は大量にいる
>* 8割以上のIT企業において、アルゴリズム力はカンスト(一部企業においては、少し持て余してしまう)

という感じらしいので、中２であるこの段階で青に到達できたのは素直にめちゃくちゃ嬉しいです。
この記事では、私が青色コーダーになるためにやったこととか、精進量とか、好きな問題などを書き留めておきます。
「この記事を見て色が一色上がった！」みたいな人が一人でもいれば幸いです。

# 伝えたいことを1行で
**[精選100問](https://qiita.com/e869120/items/eb50fdaece12be418faa#2-3-%E5%88%86%E9%87%8E%E5%88%A5%E5%88%9D%E4%B8%AD%E7%B4%9A%E8%80%85%E3%81%8C%E8%A7%A3%E3%81%8F%E3%81%B9%E3%81%8D%E9%81%8E%E5%8E%BB%E5%95%8F%E7%B2%BE%E9%81%B8-100-%E5%95%8F)を埋めるのが最強です。**

# ステータス
* 普通の中２
* プログラミング経験はPythonがあったが、アルゴリズムの経験はなし
* 数学に関しては平均以上の知識があると思っている

同レート帯に比べて
* 非常に若い
* 数学が強くアルゴリズムがやや弱い

のが特徴だと思います。
# 精進の仕方
## 写真集
![IMG_2010.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3359390/e21c4edf-5ce2-2c20-c5b8-d307a9ea9f6c.jpeg)
▲レート変動・精進グラフ
最近の精進グラフの上がり方が尋常じゃない。
レートが(狭義)単調増加なのは珍しいと思います。
![IMG_2006.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3359390/c0eced1f-4df8-9924-78f8-aed6bad8cec3.jpeg)
▲Difficulty Pies
同レート帯と比べると精進量は少ないほうだと思います。ただし、後述しますが、精進の質はかなり良いものだと思います。
![IMG_2008.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3359390/ab1cbe76-9c44-547a-5c78-6ba09a973c95.jpeg)
▲Daily Effort
AtCoderにはまったのが今年の4月頃なので、この頃から精進量が上がっているのが伺えます。
![IMG_2007.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3359390/18e2fea8-d110-451e-cffd-7977d989ea87.jpeg)
▲Climbing
解いた問題の半数以上が灰色相当の難易度だと思います。ただ難しい問題の割合も低くはないと思います。
![IMG_2009.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3359390/e714250d-538b-f090-c589-9d8b91dc1a64.jpeg)
▲Heatmap
最近青以上のStreakを絶やさない遊びをしています。かなり効果があったと思います。
![IMG_2011.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3359390/a9bca48e-9b72-98dd-a6a4-b15190292f75.jpeg)
▲Languages
基本Python勢ですが、JOIに向けてC++も学び中。
PascalとTextとRubyは遊びです。
![IMG_2005.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3359390/703f573d-2eae-15a9-9764-e1d694f115ec.jpeg)
▲AtCoder Type Checker
多く解くタイプらしいです。多分合ってます。

## 取り組み方
### 水色になるまで
[この記事](https://qiita.com/e869120/items/eb50fdaece12be418faa)を参考に、[精選100問](https://qiita.com/e869120/items/eb50fdaece12be418faa#2-3-%E5%88%86%E9%87%8E%E5%88%A5%E5%88%9D%E4%B8%AD%E7%B4%9A%E8%80%85%E3%81%8C%E8%A7%A3%E3%81%8F%E3%81%B9%E3%81%8D%E9%81%8E%E5%8E%BB%E5%95%8F%E7%B2%BE%E9%81%B8-100-%E5%95%8F)を埋めました。
青になれたのも、9割この記事のおかげだと思っています。この質の記事が無料なのがQiitaのいいところですよね(?)

その後[上級編](https://qiita.com/e869120/items/acba3dd8649d913102b5)の[精選50問](https://qiita.com/e869120/items/acba3dd8649d913102b5#3-3-%E5%88%86%E9%87%8E%E5%88%A5%E4%B8%8A%E7%B4%9A%E8%80%85%E3%81%8C%E8%A7%A3%E3%81%8F%E3%81%B9%E3%81%8D%E9%81%8E%E5%8E%BB%E5%95%8F%E7%B2%BE%E9%81%B8-100--50-%E5%95%8F)にも取り組みました。実はこっちは埋め終わってません…

あとは速解き力を鍛えるためにバーチャルコンテストを主催しました。最近は開けてないのですが…

### 青色になるまで
[典型90問](https://atcoder.jp/contests/typical90)を★5まで、また★6の一部まで埋めました。典型を抑えられたので取り組んで良かったと思っています。
あと、たしかこのタイミングで[蟻本](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)を買いました。
[この記事](https://qiita.com/drken/items/e77685614f3c6bf86f44)を参考に、今は中級編の途中まで進めました。もっと読み進めて多くの知識を身に着けたいです。
この後はAtCoder ProblemsのRecommendationを埋めたりしていましたが、なにか特定のことを習慣づけようと思い、最近になって２つのことを始めました。
どちらも青色になるのに少なからず貢献してくれたと思っています。
また、これらに関しても、精選100問で培った知識をフルに活かせたと思います。
#### [Codeforces](https://codeforces.com/)のバーチャルコンテストに毎日参加 
[Codeforces anytime](https://codeforces-anytime.firebaseapp.com/)を使用して、適正Divのバーチャルコンテストに参加しています。
海外のコンテストサイトなので、問題文が英語ですが、それは[みらい翻訳](https://miraitranslate.com/trial/)くんに全てを任せています。
AtCoderよりも非自明な構築問題が多くて面白いです。
#### 青色以上のDifficultyの問題を毎日解く
前述の写真集にも載せましたが、青色以上の問題を毎日解くようにしました。
これは一色上の問題を安定して解ければまず間違いなく青色に上がれるだろうと思ったからです。
高度な典型問題も少なくないので、とても勉強になっています。

### 解説ACについて
私は解説ACはためらいません。
勿論自分で考えはしますが、解けない問題にリソースを割かれるのが嫌なのと、特にABCの問題は典型が多いと思っているので、解説を見てでも身につけるべきかなと思います。
ここはとても個人の考えによると思いますが。

# 印象深い問題
挙げきれないので、コンテスト中に挑んだものについてのみ挙げることにします。
* [E - Throwing the Die](https://atcoder.jp/contests/abc266/tasks/abc266_e)…全体通しても初めて解けた水Diffです。まじで大好きな問題です。
* [D - AABCC](https://atcoder.jp/contests/abc300/tasks/abc300_d)…枝狩り探索の大事さを思い知らされました。
* [F - Merge Set](https://atcoder.jp/contests/abc302/tasks/abc302_f)…超頂点という概念を初めて知った問題です。工夫次第で計算量を削減できる最もわかりやすい例だと思います。
* [F - Shift Table](https://atcoder.jp/contests/abc304/tasks/abc304_f)…コンテスト中に初めて解けた青色Diffです。Unratedがまじで悔やまれる。
* [E - Art Gallery on Graph](https://atcoder.jp/contests/abc305/tasks/abc305_e)…Pythonの弊害その1。tupleのほうが早いという重要な知識を得ることができました。あとC++の偉大さを思い知りました。
* [E - Best Performances](https://atcoder.jp/contests/abc306/tasks/abc306_e)…Pythonの弊害その2。平衡二分探索木について調べるきっかけになりました。
* [C - Ideal Sheet](https://atcoder.jp/contests/abc307/tasks/abc307_c)…[とある解説](https://atcoder.jp/contests/abc218/editorial/2637)を見たのを覚えていたのが功を奏しました。これ水色になるんですか。
* [F - Make 10 Again](https://atcoder.jp/contests/abc310/tasks/abc310_f)…bitDPに気付いて通せたおかげで黄色Perfが出ました。ありがたや。
* [C - Find it!](https://atcoder.jp/contests/abc311/tasks/abc311_c)…強連結成分分解で解けちゃいました。明らかに解説の解法のほうが楽ですね。
* [E - Tangency of Cuboids](https://atcoder.jp/contests/abc312/tasks/abc312_e)…座標が小さいことに気付いて解けるべきだったなぁ、とめちゃくちゃ反省しています。
* [Ex - snukesnuke](https://atcoder.jp/contests/abc312/tasks/abc312_h)…本番中こそ解けなかったものの、めちゃくちゃ答えに近づくことができたことの成長を感じました。
* [B - Triple Pair](https://atcoder.jp/contests/arc160/tasks/arc160_b)…これが解けたおかげでレートが結構上がったので感謝しています。ちなみにAは未だに解けてません。
* [D - Everywhere is Sparser than Whole (Construction)](https://atcoder.jp/contests/arc161/tasks/arc161_d)…エスパーで通しちゃいました。気持ちよかったです。
* [B - Switching Travel](https://atcoder.jp/contests/arc164/tasks/arc164_b)…頂点1からスタートしないといけないと思ってて10ペナ程度くらいました。問題文は本当によく読みましょう…(自戒)
* [C - Add Mod Operations](https://atcoder.jp/contests/agc063/tasks/agc063_c)…入青の決め手になった、本番中に解けた最初の橙Diffです。B問題はその後も解けていないので、さっさとC問題の考察を頑張ってよかったです。

# Pythonの長所と欠点
Pythonをよく使い、C++を勉強した私にとっては、Pythonの大きな長所は以下の点であると考えます。
* コードが単純で、すぐに書ける
* 繰り返し二乗法を自前で実装しなくていい
* オーバーフローの心配が一切なく、大きな整数を多少ゴリ押して使える

逆に、Pythonを使う場合は以下の点に気をつけましょう。
* 平衡二分探索木がない…tatyamさんに感謝して[これ](https://github.com/tatyam-prime/SortedSet)をコピペしましょう。
* ACLが使えない…shakayamiさんに感謝して[これ](https://github.com/shakayami/ACL-for-python)をコピペしましょう。
* 動作が遅い…PyPyを標準的に使うようにして、細かな点で定数倍高速化をしましょう。
# おわりに
青色になりましたが、暖色コーダーたちを見てみると、ここは通過点に過ぎません。
勿論次の目標は<font color="yellow">黄色コーダー</font>です。黄色になるためにもっと精進を重ねていこうと思っています。
終わります。