Official

D - Restaurant Queue Editorial by MtSaka


この問題はキュー(待ち行列)というデータ構造の練習問題です。

キューは先入れ先出しのリスト構造を持っています。わかりやすく言うと、キューからデータを取り出すときは先にキューに入れられたデータから順に取り出すという意味です。

キューを用いてレストランの待ち列を並んだ順番に処理するこの問題と同じことを実現できます。末尾に人が並ぶ操作はキューにデータを入れる操作、先頭の人のデータを取り出す操作はキューからデータを取り出す操作にそれぞれ対応させることができます。

多くのプログラミング言語は標準ライブラリにキューが実装されているため標準ライブラリを使って容易に実装できます(C++ではstd::queue、Pythonではcollectionsライブラリのdequeなど)。また、なかったとしても、連結リストなどを用いることで再現できます。

具体的な実装方法は実装例を参照してください。

C++など多くのプログラミング言語の標準ライブラリにある配列を用いて先頭を削除する、末尾に追加すると言う操作を実現することができ、今回の問題の制約ではACを得られます。しかし、プログラミング言語によっては配列の先頭削除の計算量がキューと比較して悪かったりするため注意が必要です。

実装例(C++)

#include <bits/stdc++.h>
using namespace std;
int main() {
    int q;
    cin >> q;
    queue<int> que;
    for (int i = 0; i < q; ++i) {
        int t;
        cin >> t;
        if (t == 1) {
            int x;
            cin >> x;
            que.push(x);
        } else {
            cout << que.front() << endl;
            que.pop();
        }
    }
}

実装例(Python)

from collections import deque

q = int(input())
que = deque()

for _ in range(q):
    t, *x = map(int,input().split())
    if t == 1:
        que.append(x[0])
    else:
        print(que[0])
        que.popleft()

posted:
last update: