😊はじめに
先日のABC436で無事入青することが出来ました。
まさか自分の名前の色が青色になる日が来るとは思っておらず、AtCoderの右上を見てはニヤニヤしています。
この記事では入青するために必要だったと印象に残っている事柄を紹介したいと思います。

🕰️自分が競プロを始める前の前提知識
色変記事っぽく自分の前提をお話しします。
小さい頃からパズルが好きでした。ジャンルは選ばず、頭を使うことが好きだったと思います。小学校の算数で苦労することはありませんでした。
中高と、算数が数学になっても自分の中では好きな教科で、青チャートのレベルでした。
理系でしたので数ⅢCまでやりましたが、競プロで役立っているのは数ⅠAの知識だと思います。
大学には行っていませんので大学数学を体系的に学んだ経験はありません。
解説ページで大学数学の用語(≒高校で勉強した覚えがない)に触れるたび面食らっている状況です。
(モノイド、巡回置換、群論など)
あと記号も知らないのがたくさんあってそのたびに調べています。
($⊥$とか$∩$とか$∖$とか$∈$とか記号多すぎ)
大学数学を体系的に学んだ経験は決して必要ないんだということが言いたかったことです。
⭕AtCoder Problemsの情報
現在の精進状況を参考までに残しておきます。
🔥有効な精進方法
ここからは青色になるまでにやったことを挙げたいと思います。
ADT(AtCoder Daily Training)
本編です。この記事はこのサービスを紹介する記事です。
水色中盤で伸び悩んでいる時期からこのサービスでかなり伸びた実感があります。
運営担当のkaede2020さんに最大限の感謝を。
ADTの紹介
ADTは二年ほど前から始まったサービスで、毎週火水木曜日、一日三回行われているコンテストです。
過去問の中から問題が選出され、一時間でどれだけ解けるかを競います。
EASY、MEDIUM、HARD、ALLの難易度で分かれており、自分の実力に応じて出るコンテストを選ぶことができます。
問題数はALLが9問で、過去問のAABBCCDEF問題からそれぞれ選ばれます。
また、EASYはALLの[1,5]問目、MEDIUMはALLの[3,7]問目、HARDはALLの[5,9]問目が切り出されたコンテストになっています。
ADTの利点:「うわ出た‼️」問題を克服できる
この記事を読んでいるあなたには、過去に解けなくて放置している問題があります。
ギクッとしたあなた🫵 正常なので大丈夫です。
(していない方は素晴らしい勉強法をしていますので続けてください。)
人には得手不得手があります。
場合の数は苦手だけどDPはなんかできるとか。
競プロの問題はジャンルに分かれていて、その中でも明らかに 脳の構造を天才と入れ替えないと 一生解ける気がしない苦手ジャンルというのが必ずあります。
この苦手ジャンルというのが厄介で、コンテスト中に出てきても解けないのにupsolveする気が全く起きません。
だからこそ人は苦手問題を放置してしまいます。
そしてコンテスト本番で苦手ジャンルに当たってしまって「うわ出た‼️」となり、三完に散るのです。
これを解決するのがADTです。
もう、自分の意思で精進をする問題を選ぶのをやめましょう。
自分の得手不得手を意思決定に介在させるのをやめればバランスの良い精進が出来ます。
一週間合わせて81問ありますので精進量としても申し分ありません。
おすすめのADTの使い方
1. ライブで出る
一番のおすすめはライブで出ることです。
時間に追われながら問題を解くコンテスト本番の"あの"緊張感を疑似的に味わうことができます。
一時間集中して出ればコンテストの緊張感にも慣れることができます。
2. バチャで走る
ADTは21:00ではなくもっと早い時間に開催されています。
特に一回目と二回目は平日の夕方に行われているので、仕事や学校の関係で出られないことの方が多いと思います。
夜の自分時間にバチャで一時間みっちりやるのも十分練習になります。
3. 適正問題だけでもやる
一時間も時間が取れない場合は、自分の適性のdiffの問題だけでも解きましょう。
電車の中などでページを開いて考察だけするのも良いでしょう。
とにかく問題に広く触れるのが大切です。
私は忙しい時、各コンテストの茶色以上の問題のみ解いていました。
問題ごとの立ち回り
ADTにおいて問題は大きく分けて以下の三つです。
私はそれぞれについて違う立ち回りをしています。
1. 初めて見る問題が出た時
コンテスト本番と同じように考察と実装を進めます。解けたらうれしいです。
2. 自分の得意な問題、見たことある問題が出た時
復習の良い機会です。タイピング練習をしたり、より良い実装方針を試したりします。
3. 「うわ出た‼️」問題が出た時
苦しい時間の始まりです。顔をしかめながら実装方針を思い出します。
もし5分くらい手が動かなかったら当時のページから解説を見に行きます。
URLを見ればどのコンテストの問題かがわかります。
結論:ADTは良いぞ
問題の復習、苦手問題の克服、実装スピードの向上、知識の定着...
ADTを活用した精進はAtCoderの精進の中でもかなり効率の良い方法だと思っています。
もしこの記事で初めてADTを知った人は是非始めてください。
もちろん、無料です。
NoviSteps
苦手ジャンルや初めて学ぶジャンルについて集中的に学ぶ時に大変重宝するサイトです。
けんちょんさんをはじめとした、素晴らしい方々が運営に関わっておられます。
苦手ジャンルを自覚した時や、新しいことを学びたい時に活用してください。
私は桁DPを克服する時に活用しました。(できたとは言ってない)

AtCoder ProblemsのRecommendation
ADTが出る前にやっていた精進方法です。
AtCoder ProblemsにはRecommendationという機能があります。
場所はUser > Recommendationで、自分のレートと同じくらいのdiffの問題が列挙されているページです。
すでに解いた問題を除くこともできて、パッシブに問題へ触れられるADTと比べて、アクティブに問題を探す手段となっています。
水色になる前はこの機能を使ってひたすら緑の問題を解いていました。

自分のレートと同じdiffなので基本苦しいです。ですがこれも精進...
もし難なく解ければ自信にも繋がります。
YouTubeのコンテスト動画を見る
YouTubeにノーカットのコンテスト動画を投稿している方がいらっしゃいます。
他の人が本番中にどんな考察をしたのか、自分が苦戦した問題をどのように解いたのかなど、参考になる部分が多々あると思っています。
見るチャンネルの選定
1. 自分よりレートが高い方
自分は時間がかかった問題を上位の人がどのように解くかを見ることは、大いに価値と学びがあります。
親方の技術を見て盗むように、考察の様子やコードを分析しましょう。
また、赤の方はAtCoderにおけるプロゲーマーですので、ゲームの世界大会の手元画面を見ていると思って観戦しています。
とんでもない速度でコードが出来上がっていくのを見るのは非常に見ごたえがあります。
2. 同じレート帯の方
同じレート帯の方は考察力や実装力が同じくらいだと思います。
持つ武器が同じくらいの方がどのように立ち回っているかを見ると成長のヒントを得られることも多いです。
また、ライバルとして捉えて動向を追うのも良いでしょう。
3. 自分よりレートが低い方
自分より色が下だからといって、見る必要が無いということは無いです。
私もいくつかのチャンネルをリスペクトを持って応援しています。
他の方の成長を見るのは自分事のように嬉しく、モチベーションになっています。
4. 見ていて面白い方
いわゆるゲーム実況のジャンルに入ると思います。
競プロをやっている者のみが見られるバラエティチャンネルです。
某星人さんなどは非常に面白いです。
........
おっとこんなところにおすすめの競プロチャンネルが!
かく言う私もコンテスト動画を投稿しています。
コンテスト毎に本番の動画と振り返りの動画を投稿していますので、ぜひご覧ください。
解法ごとのドキュメントをまとめる
管理することは苦手なので、こまめにまとめるようなことはしていません。
(というかできません)
解法ごとにドキュメントをまとめている方は本当にすごいと思います。
ただ、何回も詰まったジャンルはさすがに重い腰を上げてまとめています。
まとめていますが、まとめるのが下手くそすぎてドキュメントとは言えません。
この記事を執筆するにあたって自分のメモを見直してみましたが、ひどいものです。
例:期待値DP.md(恥ずかしいので折り畳み)
ABC263_E Sugoroku 3 (diff 1659)
問題: https://atcoder.jp/contests/abc263/tasks/abc263_e
提出: https://atcoder.jp/contests/abc263/submissions/63436243
配る遷移だと立式が難しいが、貰う遷移にすると綺麗に書ける。
...これだけ?本当に期待値DP解いてきたんですか?
こんなメモでコンテスト中どうやってヒントを得るんだ。
あんな?グラフの問題って200種類あんねん。
網羅する気が全く見えない。
みなさんはちゃんとまとめた方がいいと思います。
反面教師にしてください。
精進方法まとめ
- ADT(AtCoder Daily Training)
- NoviSteps
- YouTubeのコンテスト動画を見る
- AtCoder Problems のRecommendation
- 解法ごとの
ドキュメントをまとめる
以上が青色達成に寄与したと自覚している精進方法です。
他にもJOI埋めやLibrary Checkerなどをやりましたが、この五つが大きいと思います。
📈スニペット、ショートカット、コマンドの話
競プロは問題を速く解く競技なので、5秒を削れるスニペットでも価値があります。
多いので全てを紹介はしませんが、私が整備する理由を理解して頂ければ嬉しいです。
スニペットを全て紹介する記事はまた別で書きたいと思います。
スニペット
入力
入力を受け取る部分は非本質なのでできるだけ時間をかけないためにスニペットを用意しています。
例
-
mapinput->map(int, input().split())
複数の数字の入力 -
listmapinput->list(map(int, input().split()))
配列の入力
よく出てくる構文
いろんな問題に頻出の決まった構文というものがあります。「これをしたい」と思ったらすぐ実現するようにスニペットを用意しています。
例
-
dir4->dir = [(0, 1), (1, 0), (0, -1), (-1, 0)]
四方向の移動先 -
dir8->dir = [(1, 0), (1, 1), (0, 1), (-1, 1), (-1, 0), (-1, -1), (0, -1), (1, -1)]
八方向の移動先 -
posng->if ni < 0 or H <= ni or nj < 0 or W <= nj: continue
グリッドの外の判定 -
rle->rle = [(x, len(list(c))) for x, c in groupby()]
ランレングス圧縮 -
distlist->
def distlist(st, n, edge):
q = deque([st])
dist = [-1]*n
bf = [-1]*n
dist[st] = 0
while q:
i = q.popleft()
for j in edge[i]:
if dist[j] >= 0: continue
bf[j] = i
dist[j] = dist[i]+1
q.append(j)
# return dist, bf
return dist
グラフ上のある頂点からの距離の配列を取得する関数。とりあえずこれが欲しいことはよくある
デバッグ用のスニペット
コードをバグらせた時、素早く原因を特定するためにデバッグしやすくするスニペットを用意しています。
例
-
sen->print("--------------")
大量のデータを並べて出力した時に見やすくなる -
local code->if sys.argv[-1] == "MY_JUDGE":
手元で実行する時にMY_JUDGEのコマンドライン引数を指定して、手元でのみ実行される処理を実現。INFの値を一時的に100にしたい時とかに便利
ライブラリ
tatyamさんのSortedSetなど、ライブラリとして用意しているものは全てスニペットに登録しています。
というより、スニペットに登録してライブラリだと言い張っています。
キーボードショートカット
コードを書くスピードを上げるために積極的に活用しています。
例
-
Ctrl+Shift+K-> 一行削除 -
Ctrl+Shift+;-> エディタとターミナルを行き来
コマンド
実行結果を迅速に確認するため、ターミナルで使用するコマンドを設定しています。
例
-
c-> クリップボードの内容をinput.txtに貼り付け -
rn-> 前述のMY_JUDGEコマンドライン引数を含めてanswer.pyを実行 -
cl->answer.pyの内容をクリップボードへ貼り付け
PyPyは再帰が遅いため、コード内にdfsが含まれていると警告を出すなど、ヒューマンエラーを少なくする工夫もしている
スニペットなどで稼げる数秒の積み重ねは意外と大きいです。
是非自分のやりやすいように整備してみてください。
🪟コンテストに臨む環境
最後に私がコンテストに臨む時の環境を紹介します。
プログラム言語
Pythonでコンテストに臨んでいます。
基本的に提出するのはPyPyで、再帰や遅延セグ木などPyPyが苦手な問題の場合はCodonで提出します。
エディタ
みんな大好きVSCodeです。
スニペットやキーボードショートカットなど競プロ用にチューニングしています。
仮想環境はpoetry + pyenvです。
Codonを提出する時のみwslを使っています。
キーボード
US配列のHHKB Professional HYBRID Type-Sです。
HHKBは一度使うともう戻れないです。
画面構成

左にコンテストページ、右にVSCodeを表示してメインモニターの一画面で完結しています。
サブモニターは調べものの際に使用しています。
考察メモ
電子メモパッドを使用しています。
書き捨てのメモを書くことに特化しているので、ちょっとしたメモを取るのに重宝します。
デメリットは一度消すと見られないことです。(当たり前)
iPadなどタブレットのメモを使える場合はその方が良いと思います。
手元のタブレットとパソコンの画面を接続してどっちでも見られる環境が理想だと思います。
💯これからの目標と展望
次の目標はもちろん次の色である黄色です。今回黄色パフォーマンスで入青したのもあって浮かれています。
果たして一年後に笑っているのは私かchokudaiかという勝負です。
負けられません。
精進方法を変える予定は今のところありませんが、ADTだとF問題が薄いのでここの精進は別にする必要があると思っています。
また、@igeeeeeeさんの入黄記事で紹介されていたAnkiを使った精進方法は面白いなと思って興味を持っています。
💙おわりに
以上が私の入青記事です。
入水や入青を目指す方向けに執筆したつもりです。
色変記事というより私の環境紹介記事になっている気もしますが、誰かの参考になるならそれは小さな問題です。
最後に素晴らしいコンテストを毎週開催してくださるAtCoderとadminのsnukeさんに感謝を。
それではまた別の記事でお会いしましょう。
さようなら。

