栈模拟,我用的是比较笨的方法,直接贴代码
#include<iostream>
#include<cstdio>
#include<stack>
#include<cstring>
using namespace std;
const int maxn = 1e3+10;
bool vis[maxn];
int main(){
//freopen("in.txt", "r", stdin);
int m, n, k, num, top;
cin >> m >> n >> k;
for(int i = 0; i<k; ++i){
bool flag = true;
stack<int> s;
top = 0;
memset(vis, false, sizeof vis);
for(int j = 0; j<n; ++j){
cin >> num;
if(!flag) continue;
if(num > top){
for(int i = top+1; i<=num; ++i){
if(!vis[i]){
s.push(i);
if(i != num) top = i; //栈顶为第一个小于num且没有vis的元素
}
if(s.size() > m) flag = false;
}
s.pop();
vis[num] = true;
}
else if(num < top) flag = false;
else {
s.pop();
vis[top] = true;
for(; top>=0; top--){
if(!vis[top]) break; //重新获取栈顶
}
}
}
if(flag) cout << "YES\n";
else cout << "NO\n";
}
return 0;
}