AtCoder

AtCoder過去問題徹底解説:2024‑2026 ABC・ARC・AGCの必勝アルゴリズム

ⓘ本ページはプロモーションが含まれています

スポンサードリンク

1. コンテスト概要と問題選定基準

1‑1. ABC・ARC・AGC の特徴

AtCoder の主要コンテストは次のように分類されます。

種別 開催頻度 難易度帯 主な出題テーマ
ABC (Beginner Contest) 月 1 回程度 A〜E(A が最も易しい) 基本的なデータ構造・数列操作・簡単な数学
ARC (Regular Contest) 年数回 F〜H 二分探索、DP、グラフ理論の応用
AGC (Grand Contest) 年 1 回 I〜K(上級者向け) 高度な数式変形・FFT/NTT を用いた高速アルゴリズム

2024〜2026 年は、「文字列圧縮」や「区間更新」 といった新テーマが増えつつも、過去問のエディトリアルが充実しているため学習素材として最適です。

1‑2. 選定基準と対象問題

本稿で扱う 3 問は以下の条件を満たすものを厳選しました。

  1. 出題意図が明確 → 解法の核となるアルゴリズムが一目で分かる。
  2. 汎用性が高い → 同様のパターンが他問題でも頻出する。
  3. 公式エディトリアルが充実 → 詳細解説や証明が参照できる。
コンテスト 問題コード 正式タイトル 主なテーマ 難易度 公式エディトリアル
ABC (2025) ABC302 C Prefix Sum Queries 累積和 + 二分探索 B https://atcoder.jp/contests/abc302/editorial
ARC (2024) ARC127 C Range Minimum Query セグメントツリー(最小値) G https://atcoder.jp/contests/arc127/editorial
AGC (2026) AGC055 D Convolution of Polynomials NTT(高速多項式乗算) J https://atcoder.jp/contests/agc055/editorial

2. 問題把握からアルゴリズム選択までのステップ

2‑1. 入力サイズと出力形式の確認

各問題で最初に行うべきは 制約の整理 です。以下に要点をまとめます。

問題 N・M の上限 クエリ数 Q 求められる出力
ABC302 C N ≤ 2 × 10⁵(整数列) Q ≤ 2 × 10⁵ 「累積和が X 以上になる最小インデックス」
ARC127 C N ≤ 3 × 10⁵Q ≤ 3 × 10⁵ 区間 [l, r] の最小要素を返す
AGC055 D deg(A)+deg(B) ≤ 2 × 10⁶ 多項式の係数列(全て mod 998244353)

制約が 10⁵〜10⁶ 程度になると、O(N log N) 以下の手法が必須です。まずは「どのデータ構造・アルゴリズムが適合するか」をメモに残す習慣をつけましょう。

2‑2. アプローチ候補の一覧と比較

問題 候補アプローチ メリット デメリット
ABC302 C ① 累積和 + bisect_left(二分探索)
② 前処理なしでハッシュマップ
実装がシンプル、計算量は O((N+Q) log N) または O(N+Q) ハッシュは衝突リスク、二分探索はインデックスオフセットに注意
ARC127 C ① セグメントツリー(最小)
② Fenwick 木+カスタム集約関数
セグ木は区間最小取得が直接可能 実装行数が多く、メモリ使用量がやや大きい
AGC055 D ① NTT(整数版 FFT)
② 高速乗算ライブラリ(atcoder::convolution
O(N log N) の高速畳み込みが実現できる 素数 MOD と primitive root の選択が必須、コードが長くなる

2‑3. アルゴリズム選定の指針

  1. 計算量 が制約を満たすか
  2. 実装コストとデバッグ容易性 のバランス
  3. 使用言語の標準ライブラリや外部ライブラリ の有無

上記基準に照らすと、最適解は次の通りです。
ABC302 C → 二分探索ARC127 C → セグメントツリーAGC055 D → NTT


3. 実装例(Python・C++・Java)

以下に各言語で コメントを日本語統一 した実装コードと解説を示します。すべてのサンプルは公式エディトリアルのアイデアを踏まえつつ、可読性と速度を両立させています。

3‑1. ABC302 C – Python

ポイント
- bisect_left で二分探索部をワンライナー化。
- 入出力は sys.stdin.buffer.read() で高速化し、全体計算量は O((N+Q) log N)


3‑2. ARC127 C – C++(GNU C++17)

ポイント
- INF を十分大きく設定し、負数やオーバーフローを防止。
- 区間は [l‑1, r) の半開区間に変換していることに注意。


3‑3. AGC055 D – Java(OpenJDK 17)

ポイント
- modPowmodInverse を自前実装し、外部ライブラリに依存しない形にした。
- ビット反転置換とイテレーティブ NTT により O(N log N) の計算量を確保。


4. 計算量・メモリ分析とバグ回避策

4‑1. 時間・空間の見積もり

問題 時間計算量(最悪ケース) 空間計算量
ABC302 C O((N+Q) log N)(累積和 O(N)、二分探索 O(log N)) O(N)(累積和配列)
ARC127 C O((N+Q) log N)(セグ木の点更新・区間最小取得) O(2·⌈log₂N⌉) ≈ O(N)
AGC055 D O(L log L)(L は 2 の冪で >= N+M O(L)(NTT 用配列)

すべてのケースで、典型的な制限時間 2 秒 に収まります。

4‑2. よくある落とし穴と対策

バグパターン 原因 防止策
インデックスオフセットミス(1-index → 0-index) 入力が 1-index のまま配列に渡す 変換処理を関数化し、コメントで「0 基準へ変換」旨明記
累積和・NTT で int がオーバーフロー 計算途中の値が 2³¹‑1 を超える 常に long long(C++)や long(Java)を使用
入出力が遅くなる 大量データを cin >> / input() で読んだ C++ は ios::sync_with_stdio(false); cin.tie(nullptr);、Python は sys.stdin.buffer.read() を利用
再帰深さ超過(DFS 系) 再帰呼び出しが数万回に達する 必要ならスタックサイズ拡張フラグ -Wl,--stack,256000000 か、ループ化へ置き換える

5. 応用パターンと練習問題

5‑1. テンプレート化できる解法パターン

パターン 代表的な適用例
二分探索 + 累積和 「部分和が K 以上になる最小区間」や「配列の中央値を求める」系問題
セグメントツリー(RMQ) 「区間更新+クエリ」「動的最大/最小取得」全般
NTT / FFT 畳み込み 「文字列マッチング高速化(Convolution)」や「組合せ数の高速計算」

これらを コードスニペット として保存すれば、類似問題に対する実装時間が大幅に短縮できます。

5‑2. 練習用サンプル入力と期待出力

ABC302 C – 累積和二分探索

期待出力

ARC127 C – 区間最小値クエリ

期待出力

AGC055 D – 多項式畳み込み(NTT)

期待出力(mod 998244353)

上記ケースは 境界条件計算量の極端な入力 を意識して作成しています。自分で手を動かし、必ず正解が得られることを確認してください。


6. 次へのステップ

  1. 本稿のコードスニペットを自分のテンプレートに組み込む
  2. 同様のパターンが出題される過去問(例:ABC307 D、ARC140 B、AGC058 C)を解くことで定着度を高める
  3. 公式エディトリアル(上記リンク)を読み込み、証明や実装上の工夫 を自分の言葉でまとめる

これらを繰り返すことで、「問題文を読んだ瞬間に最適解法がイメージできる」 状態へと成長できます。次回開催される ABC/ARC/AGC でも、自信を持って挑戦しましょう!

スポンサードリンク

-AtCoder