前言

传送门

正文


参考题解

#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;
}