A30291. 一头进两头出
填空题
困难
知识点
题目描述
一头进两头出
题目描述
某队列允许在其两端进行出队操作,但仅允许在一端进行入队操作。现给定入队的序列,请你判断一系列出队序列是否可能。例如按 1 、 2、 3、 4、 5 的顺序入队,则 1 、 3、 2、5、 4 这样的出队序列是可以得到的,但 5、 1 、 3、 2、 4 就是不可能得到的。
时间限制: 1000 内存限制: 262144
输入
输入首先在一行中给出两个正整数 N 和 K(≤ 10),分别是入队元素的个数和待查验的序列个数。随后一行给出 N 个两两不同的整数组成的入队序列; 再跟着 K 行,每行给出由 N 个入队整数组成的出队序列。同行整数间以空格分隔。
输出
对每个需要查验的出队序列,如果是可能的,则在一行中输出 `yes`,否则输出 `no`。
样例输入
5 4
10 2 3 4 5
10 3 2 5 4
5 10 3 2 4
2 3 10 4 5
3 5 10 4 2
样例输出
yes
no
yes
yes
参考答案
#include<iostream>
using namespace std;
const int N=100010;
int n,k;
int a[N],b[N],q[N]; //输入序列、删除序列、队列
bool check()
{
int hh=0,tt=-1;
for(int i=0,j=0;i<n;i++)
{
q[++tt]=a[i];
while(hh<=tt)
{
if(q[hh]==b[j]) j++,hh++; //跟队头相等删除队头
else if(q[tt]==b[j]) j++,tt--; //跟队尾相等,删除队尾
else break;
}
}
return hh>tt;
}
int main()
{
cin>>n>>k;
for(int i=0;i<n;i++) cin>>a[i];
while(k--)
{
for(int i=0;i<n;i++) cin>>b[i];
if(check()) cout<<"yes"<<endl;
else cout<<"no"<<endl;
}
return 0;
}
上一题
下一题