前言
正文
参考题解
#include<iostream>
#include<algorithm>
#include<stack>
using namespace std;
/* 题意: 给定一个容量为m的栈,入栈序列为1~n,进行k次查询,每次查询给出一个 序列,问这个序列是否是可能的出栈顺序 思路: 按照题意进行模拟,将1~n依次入栈,若入栈的元素,恰好等于当前出栈序列 当前等待出栈的元素,则让栈顶元素出栈,同时出栈序列指针后移到下一个等待出栈的元素 */
const int maxn=1e3+10;
int a[maxn];
stack<int> st;
int main(){
int m,n,k;
cin>>m>>n>>k;
while(k--){
while(!st.empty()){//每次询问前需要先清空栈
st.pop();
}
int curr=1;
bool flag=true;//flag==true表示是可能的出站序列
for(int i=1;i<=n;i++){//待出栈的序列
cin>>a[i];
}
for(int i=1;i<=n;i++){
st.push(i);//i入栈
if(st.size()>m){//超过栈容量
flag=false;
break;
}
while(!st.empty()&&st.top()==a[curr]){//注意需要栈不为空才能出栈
st.pop();
curr++;
}
}
if(st.empty()&&flag){//栈为空且flag==true时合法
printf("YES\n");
}else printf("NO\n");
}
return 0;
}