なんだこの記事
AtCoder初心者の知り合いに向けて、知っておくべきことを書き記します。
彼はAtCoderに関してかなり無知なので、「そんなの当たり前だろ」と思うようなことも書きます。
また、Must・Should・Wantの段階に分けて書きます。
Mustを読めばAtCoderを始められます。また、Shouldまで読めば効率よく上達できます。
Want(つまり最後)まで読めば競プロ系のコミュニティで「なんだこの用語」となりにくくなります。
Must
知らなくてもアカウント作成はできますが、競技を始めるうえでほぼ必須の知識です。
AtCoder、競プロ自体に関すること
- AtCoderとは?
- プログラミングの問題を解いて競うオンライン競技プログラミングサイト
- 日本発のサービスであるが、海外からの参加者もいる
- 競技プログラミング(競プロ)とは?
- アルゴリズム・数学・データ構造などを使ってプログラミング問題を解く競技
- 「プログラムを書くこと」だけでなく、問題をどう解くか考えることが重要
- マインドスポーツの一種
- AtCoderでは、基本的に自分でコードを書いて提出し、自動判定してもらう
- 問題には入力・出力・制約・サンプルなどが書かれている
コンテスト全体に関すること
- AtCoderには定期的にこのようなコンテストが開催されている
- ABC:AtCoder Beginner Contest
- ARC:AtCoder Regular Contest
- AGC:AtCoder Grand Contest
- etc.
- 初心者なら基本的には ABCから始めればよい
- 使用するプログラミング言語
- C++、Python、Rustなど複数の言語が使える
- Rating
- コンテストの成績から計算される実力の目安
- Ratingの色
- 灰 → 茶 → 緑 → 水 → 青 → 黄 → 橙 → 赤
- 「入茶」「入緑」などの意味
- それぞれの色のRating帯に到達すること
- コンテストは過去問としても解ける
- 本番に参加しなくても練習できる
- 解けなかった問題も勉強になる
- 解説を読んで解法を理解することも競プロの勉強
- コンテスト中のルール
- 検索・生成AIなどについてはコンテストごとのルールを確認する
- ちなみにABC・ARC・AGCなどでは許可されていない
AtCoder Begginer Contest(ABC)に関すること
- 「Beginner」といっても、ABCの後半問題まで全部初心者向けという意味ではない
- ABCは現在、100分程度で複数問題を解く形式が基本
- 問題は基本的にA → B → C → D → E → F → Gと難しくなる
- ただし、必ずこの順番で解かなければならないわけではない
- コンテスト中は問題を自由に行き来できる
- 全問正解する必要はない
- (現に私も最高で4問正解です)
- 提出(Submit):書いたプログラムをAtCoderに提出して判定してもらう
- 判定
- AC = 正解
- WA = 不正解
- TLE = 時間切れ
- RE = 実行時エラー
- CE = コンパイルエラー
- コンテストには制限時間がある(ABCだと100分)
- 問題文の「制約」
- N ≤ $2\times 10^5$など
- ABCのC問題以降において、解法を考えるうえで非常に重要
このあたりを理解していれば、とりあえず「AtCoderで何をやっているのか分からない」状態からは脱出できます。
Should
AtCoderを数回やった後くらいから、これらを知っているとかなり便利です。
コンテストに関すること
- バーチャル参加
- 過去のコンテストを本番のような形式でプレイする
- コンテスト後の復習
- 解けなかった問題の解説を読む
- 自分で実装し直す
- 他人の提出コード
- 別解や実装方法を学ぶために読める
問題に関すること
- 計算量
- O(N)、O(N²)、O(N log N)など
- 入力サイズに対してどのくらい計算が必要かを表す
- アルゴリズム
- 問題を効率的に解くための方法
- 考察:問題文・制約から、何をすれば答えを求められるかを考えること。
- 解法:考察によって見つけた、問題を解くための具体的なアルゴリズムや手順。
- 実装:考えた解法を、実際にプログラムとして書くこと。
- 競プロでは、「考察 → 解法 → 実装」の順に進めるのが基本です。
- 良い解法でも、実装を間違えればACにはなりません。
- 逆に、実装力だけでなく解法を考える力が非常に重要です。
- Ratingは絶対的な実力ではない
- 得意分野やコンテストとの相性などによっても変動する
AtCoderのコミュニティに関すること
- Difficulty / Diff
- 問題の難易度を表す指標
- 非公式の有志コンテンツである、AtCoderProblemsで確認できる
- Difficultyの定義は、
「その問題を見たとき、どの程度の現在の内部Rating(補正前の実力値)の人がコンテスト中に50%の確率でACできるか」
である - つまり、Difficultyが500である問題は、内部Ratingが500程度の人が50%の確率でACできる
- RatingとDifficultyは別物
- Rating = 人の実力
- Difficulty = 問題の難しさ
- AtCoder Problems
- 過去問を探したり、解いた問題を管理したりできる外部サービス
AtCoder NoviStepsに関すること
- AtCoder NoviSteps
- AtCoderの過去問を難易度別・テーマ別に整理し、学習状況を記録できる非公式サービス
- グレード
- NoviSteps独自の問題難易度。11Q → 10Q → … → 1Q → 1D → … → 6Dの17段階で、後ろほど難しい
- 回答状況
- 各問題について、自分の取り組み状況を記録するもの
- AC → 自力で正解した
- 解説AC → 公式・有志の解説を読んだ後に正解した
- 挑戦中 → 現在考察中、または不正解になっている状態
- 未挑戦 → まだその問題に取り組んでいない状態
Want
これを読めば競プロ系のコミュニティで「なんだこの用語」となりにくくなります。
コミュニティでの用語
- 「AB2完」「ABC3完」「ABD3完」
- 「AからBまで2問解けた」「AからCまで3問解けた」「A,B,D問題だけ解けた」解いたという意味
- 「全完」
- コンテストの全問題を解くこと
- 「茶diff」「緑diff」
- diffがその色帯程度の数値であるという意味
- diffが500なら、その問題は茶diffです
- 「入水」「入青」などの色表現
- 「入○」は「○色になった」という意味
- AtCoder界隈では「入水」は自殺という意味ではない
- 「バチャ」
- バーチャル参加の略
- 「精進」
- 過去問を解いたり、アルゴリズムを勉強したりすること
サービス等
- Qiita・Zenn・個人ブログなどの競プロ記事
- 入色記事などが投稿されている
- 入色記事とは「入茶・入緑・入水したことを報告し勉強方法などを共有する記事」のこと
- 公式解説(Editorial)
- コンテスト後に公開される公式解説
- 他人のコードから学ぶ文化
- コンテスト後に「復習(Upsolve)する」という文化
- Novistepsに関すること
- 一覧表 → コンテスト別・グレード別に問題を探せる機能
- 問題集 → 特定のトピックについて、例題・類題をまとめて解くための機能
- 難易度投票 → ユーザーが問題の難易度を投票し、コミュニティで難易度評価を整えていく仕組み