Official
B - Card Pile Editorial
by
B - Card Pile Editorial
by
sounansya
この問題は スタック と呼ばれるデータ構造に関する問題です。
スタックは、データを順番に積み重ねて管理する「後入れ先出し(LIFO: Last In, First Out)」の特性を持つデータ構造です。以下の2つの基本操作によって、データの追加と削除を行います。
- プッシュ(push)
- スタックの一番上(トップ)に新しいデータを追加する操作です。新しい要素は、現在のトップの上に積み重なる形で追加されます。
- ポップ(pop)
- スタックの一番上(トップ)にあるデータを取り出し、削除する操作です。最も最後に追加されたデータが最初に取り出されるため、「後入れ先出し(LIFO)」の動作を実現します。
今回の問題では、タイプ \(1\) のクエリがプッシュに、タイプ \(2\) のクエリがポップに対応する操作となります。
このスタックと呼ばれるデータ構造は多くのプログラミング言語に組み込みの機能として用意されており、一から実装する必要はありません。
これらの知識をふまえてこの問題を解くことを考えます。
まず、はじめに整数 \(0\) の書かれたカードが \(100\) 枚積み重なったカードの山があります。この状態は、最初に空のスタックを用意し、その中に \(0\) を \(100\) 回入れることで実現することができます。 その後は順番にクエリを受け取り、タイプ \(1\) ならプッシュ操作を、タイプ \(2\) ならポップ操作を順に行っていけば良いです。
Python と C++ による実装例を以下に示します。
stack = []
for _ in range(100):
stack.append(0)
Q = int(input())
for _ in range(Q):
query = list(map(int, input().split()))
if query[0] == 1:
x = query[1]
stack.append(x)
else:
print(stack.pop())
#include <bits/stdc++.h>
using namespace std;
int main() {
stack<int> st;
for (int i = 0; i < 100; i++) {
st.push(0);
}
int Q;
cin >> Q;
for (int i = 0; i < Q; i++) {
int c;
cin >> c;
if (c == 1) {
int x;
cin >> x;
st.push(x);
} else {
cout << st.top() << endl;
st.pop();
}
}
return 0;
}
posted:
last update: