解题思路:
只要入栈序列当前的数比出栈序列当前的数小,就入栈直到相等,再判断栈是否过大,再判断栈顶元素与当前的出栈序列的数是否相等,出现不合法的情况直接退出即可。
代码如下:
#include<cstdio>
#include<stack>
#include<algorithm>
using namespace std;
const int maxn = 1000 + 5;
int cnt[maxn];
int main()
{
int m, n, k;
while(scanf("%d%d%d", &m, &n, &k) == 3)
{
for(int i = 0; i < k; i++)
{
stack<int> s;
for(int j = 0; j < n; j++)
scanf("%d", &cnt[j]);
int x = 1, flag = 1;
for(int j = 0; j < n; j++)
{
if(s.empty()) s.push(x++);
while(x <= cnt[j] && x <= n) s.push(x++);
if(s.size() > m) {flag = 0;break;}
if(s.top() == cnt[j]) s.pop();
else {flag = 0; break;}
}
if(flag) printf("YES\n");
else printf("NO\n");
}
}
return 0;
}