测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

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; }
上一题 下一题