AIで解説 AtCoder攻略 スタック・キュー

読了 約8分 たびすけ
AIで解説 AtCoder攻略 スタック・キュー

スタック・キューページの位置づけ

項目内容
必修度重要
学習目安標準
前提list・deque
対象問題30問(推定値あり30問、未算出0問)

この記事のdifficulty区分は、問題を解く順番を決めるための目安です。AtCoderの公式なA〜F区分ではなく、取得できたdifficulty推定値を次の範囲に分けています。

学習目安difficulty推定値問題数
入門difficulty < 04
標準0〜79915
標準〜発展800〜11996
発展1200以上5
未算出0

直前に追加した要素や、先に入った要素を順番どおり処理します。隣接する同種要素をまとめると、長い列も一度の走査で扱えます。

問題ごとの細かな実装は異なりますが、最初に確認する条件は共通しています。

スタック・キューの見分け方

  • 最後に入れたものから取り出す
  • 先に入れたものから取り出す
  • 隣接要素の削除・結合を繰り返す

スタック・キューの実装前チェック

  • 追加と取り出しの順番を図にする
  • 空のスタック・キューを確認する
  • 同じ値をまとめる単位を決める

先に確認する文法・ライブラリ

まずは必須Python文法で、入力・配列・条件分岐・ループなどの基本を確認してください。問題に合わせたキュー、ヒープ、二分探索などの選び方は標準ライブラリ・定石にまとめています。

代表問題で実装を確認する

最初の一問として、ABC247 D G. Cylinder公式解説)を解きます。同じ値が連続して並ぶ部分を(値,個数)としてdequeに保存します。先頭から必要な個数だけ取り出すので、1個ずつ展開しません。

from collections import deque

Q = int(input())
queue = deque()
for _ in range(Q):
    query = list(map(int, input().split()))
    if query[0] == 1:
        _, x, c = query
        queue.append([x, c])
    else:
        _, c = query
        answer = 0
        while c:
            x, count = queue[0]
            take = min(c, count)
            answer += x * take
            c -= take
            if take == count:
                queue.popleft()
            else:
                queue[0][1] -= take
        print(answer)

各グループを追加・削除する回数が高々Qなので、全体O(Q)時間・O(Q)メモリです。

スタック・キューの学ぶ順番

このページでは全件を一度に並べず、difficultyの推定値を目安に代表問題を段階分けしています。難易度が未算出の問題は、制約と出題意図を先に確認します。

まず解く

問題公式解説出題意図difficulty
ABC419 B Get Min公式解説公式Editorialの方針を get min deque として整理する。-624
ABC396 B Card Pile公式解説Simulate card insertion and removal from piles using stack-like containers.-556
ABC358 B Ticket Counter公式解説Official editorial intent is classified as queue service simulation.-490
ABC433 B Nearest Taller公式解説公式Editorialの方針を nearest taller stack として整理する。-454
ABC351 C Merge the balls公式解説Official editorial intent is classified as equal stack merge.175

次に解く

問題公式解説出題意図difficulty
ABC413 C Large Queue公式解説公式Editorialの方針を run-length queue として整理する。177
ABC394 D G. Colorful Bracket Sequence公式解説Use a stack to match colored opening and closing brackets and validate the sequence.216
ABC389 C Snake Queue公式解説蛇の各要素をキューへ追加し、先頭からの累積オフセットで位置クエリに答える。220
ABC447 D Take ABC 2公式解説Use a stack to erase every newly formed ABC pattern.430
ABC283 D G. Scope公式解説Push a new scope on ‘(‘ and remove its variables on ‘)’; reject a variable reused in any active scope.453

挑戦問題

問題公式解説出題意図difficulty
ABC247 D G. Cylinder公式解説同じ値の個数をまとめたキューから指定個数だけ取り出し、値の総和を計算する。468
ABC428 C Brackets Stack Query公式解説公式Editorialの方針を bracket stack query として整理する。483
ABC237 D G. LR insertion公式解説Lなら左、Rなら右へiを追加する操作をdequeで行い、最終列を出力する。544
ABC328 D G. Take ABC公式解説Use a stack to remove every newly formed ABC substring.555
ABC240 D G. Strange Balls公式解説同じ数字の連続個数をスタックで持ち、個数が数字に達した塊を消して残数を出力する。570

問題文を読んだら、まず「見分け方」のどれに当たるかを一行で記録します。当てはまらない問題は、別のページへ移す判断自体を復習材料にします。

スタック・キューの次に読むページ

シミュレーションで状態を更新する文字列の走査・一致を高速に処理するFenwick木・セグメント木で区間を更新する