难得一次就AC
思路:
根据栈的特性并且结合本题的入栈数据(1-N),可以发现合法的出栈数据一定是递减的,只要连续长度不超过m;但是要注意不能跨越没有出栈的数据出栈,因此需要记录已经出栈的数据,查找每两个连续递减出栈数据之间没有未出栈的数据。
#include <iostream>
using namespace std;
#define N 1000+10
int main() {
int m,n,k;
cin>>m>>n>>k;
while(k--) {
int num[N]={0};
int pos[N]={0};
int flag=1;
int len=0;
for(int i=1; i<=n; i++) {
cin>>num[i];
if(flag==1) {
if(num[i]>num[i-1]) {
len=1;
pos[num[i]]=1;
} else {
len++;
pos[num[i]]=1;
if(len>m) flag=0;
for(int j=num[i-1];j>=num[i];j--){
if(pos[j]==0) flag=0;
}
}
}
}
if(flag==0)
cout<<"NO"<<endl;
else
cout<<"YES"<<endl;
}
return 0;
}