Yazid 是一名 OI 初学者。他最近在研究基础数据结构:队列和栈。某天, Yazid 脑洞大开,发明了一种叫做“队栈”的数据结构。
众所周知,队列是先进先出的数据结构,而栈是先进后出的数据结构。而 Yazid 发明的队栈则同时支持查询并删除其中最早被插入的元素和最晚被插入的元素。
Yazid 有一个初始为空的队栈和一个黑盒.(这是一个存放数字的盒子),接下来,他要依次执行 Q 个操作。操作分为 4 种:
push:将一个非负整数加入队栈。
pop_queue:找出队栈中最早被插入的元素,将其取出放入黑盒,并从队栈中删除。
pop_stack:找出队栈中最晚被插入的元素,将其取出放入黑盒,并从队栈中删除。
print:将黑盒中的所有数取出,并按被放入的先后顺序从左右排列得到一个整数。
• 例如:黑盒中依次被放入了 0,23.330.6打印的整数即是233306。
由于 Yazid 懒于在每次 push 操作时想插入的数,因此他提前写好了一个长度为 n的插入序列 A(下标从 1 开始)。在接下来的所有 push 操作中, Yazid 会依次地、循环地将这些数加入队栈。具体来说:
• 在首次 push 操作时, Yazid 会将 A1 加入队栈。
• 在之后的每次 push 操作中,假设 Yazid 上次 push 时加入的数是 Ai,则本次他会将 Ai+1 加入队栈。
• 在上一种情况中,特别地,如果 i = n,则 Yazid 本次会将 A1 加入队栈。
请你依次输出 Yazid 通过 print 操作获得的整数。
第 1 行一个整数 n,表示插入序列的长度。
第 2 行 n 个用单个空格隔开的非负整数A1,A2,..,An描述插入序列。
第 3 行一个整数 Q,表示操作数目。
第 4 行 Q 个紧挨着的 1 ~4之间的数字,依次描述每个操作,每个数字表示操作的编号(各操作对应的编号见【题目描述】)。
• 保证所有操作的合法性。即保证:
– 执行任意 pop_queue 和 pop_stack 操作时队栈不为空。
– 执行任意 print 操作时黑盒不为空。
对于所有print操作,输出一行一个整数,表示该print操作中Yazid获得的数
4
0 23 330 6
12
121313124134
233306
0
数据范围:n<=10000,Q<=10^7
#include<bits/stdc++.h>
#include<deque>
#include<queue>
using namespace std;
deque<long long> q;
queue<long long> h;
long long a[1000010],b[10000010];
char c[1000010];
int main(){
long long n,m,i,k;
cin>>n;
for(i=1;i<=n;i++){
cin>>a[i];
}
cin>>m;
cin>>c;
for(i=0;i<m;i++) b[i+1]=c[i]-'0';
k=1;
for(i=1;i<=m;i++){
if(b[i]==1){
q.push_back(a[k]);
k++;
if(k>n) k=1;
}
if(b[i]==2){
h.push(q.front());
q.pop_front();
}
if(b[i]==3){
h.push(q.back());
q.pop_back();
}
if(b[i]==4){
while(!h.empty()){
if(h.front()!=0) cout<<h.front();
if(h.size()==1&&h.front()==0) cout<<"0";
h.pop();
}
cout<<endl;
}
}
return 0;
}
50分求调