Contents
AtCoder のコンテスト種別と難易度(A/B 問の特徴)
AtCoder では初心者から上級者までが楽しめるように大会が分かれています。本セクションでは各コンテストの対象層と、特に ABC に出題される A・B 問の傾向を解説します。これらを把握すれば、最初に挑むべき問題が明確になり、スムーズに AC へと導くことができます。
コンテストタイプ別概要
以下の表はコンテストごとの参加者層・出題数・難易度感をまとめたものです。
| タイプ | 主な参加者層 | 出題数 (A〜F) | 難易度の目安 |
|---|---|---|---|
| ABC | 初心者〜中級者 | 6問 | A・B が実装中心、C 以降は基礎アルゴリズム |
| ARC | 中級者以上 | 6問 | B でも二分探索や DP の入口が出る |
| AGC | 上級者 | 6問 | A から高度な数論・構造的思考が要求される |
※コンテスト一覧は公式ページ https://atcoder.jp/contests/ を参照してください。
A問題・B問題の出題傾向
A 問と B 問はそれぞれ次のような特徴があります。
- A問:入力を正しく読み取り、簡単な条件分岐や数値計算で解決できることが多いです。実装ミス(インデント・型変換)が唯一の障壁となります。
- B問:貪欲法・ソート・累積和など、1〜2 行で書ける基本アルゴリズムを要求します。制約が大きくなるため、高速入出力が必要になるケースがあります。
これらの問題は「実装と基礎アルゴリズムの正確さ」だけでクリアでき、競技プログラミングへの入り口として最適です。
Python (CPython 3.11) 環境と高速入出力のベストプラクティス
AtCoder では現在 Python 3.11(CPython) と PyPy3 7.3.12 が公式に提供されています。本セクションではローカル環境との相違点、提出時の言語選択方法、そして実戦で役立つ高速入出力テクニックをまとめました。
ローカル環境と AtCoder 実行環境の違い
以下にローカル(Python 3.11)と AtCoder の実行環境で注意すべきポイントを示します。
- 標準ライブラリ:CPython 3.11 では新しい関数や高速化が追加されていますが、AtCoder の CPython は 3.8/3.9 系列に比べて若干遅い点があります。
- JIT の有無:PyPy3 は JIT コンパイルによりループ中心のコードが数倍速くなります。一方 CPython は安定した実行速度とデバッグしやすさが利点です。
- メモリ制限:どちらも 1 GB の上限ですが、PyPy3 は GC が頻繁に走るためメモリ使用量が増えることがあります。
提出時に選択できる言語
AtCoder の提出画面で「Language」プルダウンから次のいずれかを選びます。
- Python 3.11 (CPython) – 最新の標準ライブラリが使える安全な選択肢。
- PyPy3 (7.3.12) – 高速化が期待できるが、JIT の挙動に注意が必要。
したがって、ローカルで CPython 3.11 を使用しつつ、実際の提出は目的に応じて上記二択から選びます。
高速入力・出力テクニック
競技プログラミングでは input() よりも sys.stdin.readline が圧倒的に速いです。以下のテンプレートをベースにすると、ほとんどの ABC B 問で TLE を防げます。
|
1 2 3 4 5 6 7 8 9 10 |
import sys def fast_input() -> str: """1 行分の入力を高速に取得し、末尾改行を除去して返す""" return sys.stdin.readline().rstrip() def fast_print(*args, **kwargs) -> None: """print の代替。引数を空白で結合して 1 回の write で出力する""" sys.stdout.write(' '.join(map(str, args)) + '\n') |
sys.stdin.readlineはバッファリングされた入力をそのまま取得でき、.rstrip()で改行だけを除去します。- 出力は
printの内部呼び出しよりもオーバーヘッドが小さいsys.stdout.writeを利用します。大量出力が必要な場合はリストに文字列を貯めて最後に''.join()でまとめ書きするとさらに高速です。
APG4bPython ガイドの要点と学習ロードマップ
APG4bPython は AtCoder が公式に提供する Python 入門教材です。本節では重要章へのリンクと、3 日間で効率的に身につける学習プランを示します。
重要章とリンク
以下の章は ABC A/B 問に直結する知識が詰まっているため必読です。
| 章 | 内容 | リンク |
|---|---|---|
| 基本構文・データ型 | 変数、リスト、辞書の基本操作 | https://atcoder.jp/contests/APG4bPython/tasks |
| 標準入出力 | sys.stdin.readline の使い方とサンプル |
同上 |
| ライブラリ活用例 | itertools, bisect, heapq の簡易利用法 |
同上 |
学習ロードマップ(3 日間プラン)
- Day 1 – 基本文法とリスト操作を学び、簡単なスクリプトを書き切る。
- Day 2 – 入出力章を実装し、上記テンプレート
fast_inputを自分のコードに組み込む。 - Day 3 –
itertools.productとbisect_leftのサンプルを動かし、過去問 10 問で実践的に使う。
このロードマップ通りに学習すれば、ABC A/B 問の壁は確実に突破できます。
初心者向け過去問 10 選と解法方針
ここでは初心者が最初に手をつけるべき ABC の A/B 問を厳選し、それぞれで頻出する基本アルゴリズムを示します。
問題一覧(番号・概要)
下表は問題名、難易度評価(★=星1つが最も簡単)、そして主に使用されるアルゴリズムです。
| No. | タイトル (ABC) | 難易度 | 主なアルゴリズム |
|---|---|---|---|
| 1 | ABC083 A – Some Sweets | ★☆☆ | 条件分岐 |
| 2 | ABC087 B – Coins | ★★☆ | 貪欲法 |
| 3 | ABC090 C – Flip, Flip, and Flip Again | ★★☆ | ビット操作 |
| 4 | ABC091 A – Two Coins | ★☆☆ | シミュレーション |
| 5 | ABC092 B – Binary String | ★★☆ | 文字列走査 |
| 6 | ABC094 C – Many Balls | ★★★ | ソート+二分探索 |
| 7 | ABC099 B – Stone Monument | ★★☆ | 累積和 |
| 8 | ABC101 A – Digits Parade | ★☆☆ | 桁数取得 |
| 9 | ABC102 B – Maximum Difference | ★★☆ | ソート |
| 10 | ABC104 C – All Green | ★★★ | 貪欲+集合 |
各問題は「何が問われているか」を正しく把握し、表にある基本アルゴリズムのいずれかを 1 つ選べば実装は数十行で収まります。
基本アルゴリズム別アプローチ
- 貪欲法:大きい順に要素を取ることで最小枚数や最大距離が得られる(例: ABC087 B)。
- ソート + 二分探索:配列を昇順に並べ、
bisect_left/rightで境界を高速に取得する(例: ABC094 C)。 - 累積和:区間の合計を O(1) で求めるために前処理
prefix[i] = prefix[i‑1] + a[i]を行う(例: ABC099 B)。
これらのテクニックは ABC B 問の 80% 以上で有効です。
コードテンプレートとサンプル実装
以下に AtCoder 用の共通テンプレートと、代表的な 3 問の実装例を示します。コメント付きなので初心者でも意図がすぐ分かります。
共通テンプレート
|
1 2 3 4 5 6 7 8 9 10 11 |
import sys from bisect import bisect_left, bisect_right def input() -> str: """高速入力用に readline をラップ""" return sys.stdin.readline().rstrip() # ------------------------------------------------- # ここから各問題のロジックを実装してください # ------------------------------------------------- |
input()を上書きして高速化し、必要に応じてbisect系関数を先頭でインポートしています。
サンプル実装抜粋
1. ABC083 A – Some Sweets(条件分岐)
|
1 2 3 4 5 6 7 8 |
def main() -> None: a, b = map(int, input().split()) # 合計が 10 以上なら OK、未満なら NG print("OK" if a + b >= 10 else "NG") if __name__ == "__main__": main() |
map(int, …)で一行入力を整数に変換し、三項演算子で結果文字列を直接出力しています。
2. ABC087 B – Coins(貪欲法)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
def main() -> None: n = int(input()) coins = [500, 100, 50, 10, 5, 1] # 大きい順に並べる ans = 0 for c in coins: cnt = n // c # 現在のコインで取れる枚数 ans += cnt n -= cnt * c # 残金を更新 print(ans) if __name__ == "__main__": main() |
- 整数除算
//を用いて最小枚数が保証されることをコメントで明示しています。
3. ABC094 C – Many Balls(ソート + 二分探索)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
def main() -> None: n, k = map(int, input().split()) x = list(map(int, input().split())) x.sort() lo, hi = 0, x[-1] - x[0] def feasible(d: int) -> bool: """距離 d を保って K 個以上置けるか判定""" cnt, last = 1, x[0] for v in x[1:]: if v - last >= d: cnt += 1 last = v if cnt >= k: return True return False while lo < hi: mid = (lo + hi + 1) // 2 # 上方向丸めで無限ループ防止 if feasible(mid): lo = mid else: hi = mid - 1 print(lo) if __name__ == "__main__": main() |
- ソート後に二分探索を行い、
feasible関数で配置可能か判定しています。 midの計算は「上方向丸め」 (+1) を入れることで境界条件のバグを防止します。
これらのサンプルは「主要行にコメント」を付与し、初心者がコードの意図を即座に理解できるよう配慮しています。
ローカルテスト・提出フローとデバッグ Tips
本節ではローカルでの検証手順から AtCoder への実際の提出方法、そしてよくあるエラーとその対策までを体系的にまとめました。
ローカルでの検証手順
- サンプル入力ファイル作成:
sample.txtに問題ページのサンプル入出力を書き込む。 - 実行コマンド:
python3 main.py < sample.txtで標準入力をリダイレクトし、期待通りの出力が得られるか確認する。 - 自動テスト導入:簡易的に
pytestを利用して関数単位でユニットテストを書くと回帰防止に有効です。
|
1 2 3 |
pip install pytest # 初回だけ実行 pytest -q test_main.py # テスト実行例 |
AtCoder への提出手順(UI)
- コンテストページの 「Submit」 ボタンをクリック。
- 言語選択プルダウンから Python 3.11 (CPython) または PyPy3 (7.3.12) を選ぶ。
- エディタにローカルで動作確認したコードを貼り付け、「Submit」 を押すだけです。
- 判定結果(WA / TLE / AC)はリアルタイムで表示されます。
よくあるエラーと対策
| エラー | 主な原因例 | 推奨対処法 |
|---|---|---|
| IndentationError | タブとスペースが混在、インデントが不揃い | エディタ設定を「タブ → 4 スペース」に統一し、autopep8 で自動整形 |
| ValueError: invalid literal for int() | 空行や余計な文字列を int() に渡す |
input().strip() を必ず使用し、サンプル入力の改行数を正確に再現 |
| Time Limit Exceeded (TLE) | input() のまま大量データを読む、アルゴリズムが O(N²) 以上 |
sys.stdin.readline に置換し、計算量を O(N log N) 以下に削減 |
| Runtime Error | 配列外参照やゼロ除算 | 境界チェック (if i < len(arr):) と例外処理で防御的プログラミング |
これらのポイントさえ抑えておけば、入力関連・実装ミスによる失敗は大幅に減少します。
次のステップ(まとめ)
- APG4bPython を一通り読み、
fast_input / fast_printテンプレートをローカルで試す。 - 本記事で紹介した 過去問 10 選 に取り組み、各問題で使用する基本アルゴリズムを確実にマスターする。
- 解いたコードは GitHub に公開し、レビューや他者との情報共有を通じて更なる成長を目指す。
この流れを踏めば、ABC の A/B 問だけでなく、ARC・AGC へのステップアップも自然にできるようになります。ぜひ実践してみてください!