一开始忘了栈空的时候也要push,结果一堆段错误,我以为是读入数字计数不对,改用vector先存发现没卵用,仔细看了看代码才突然意识到。。。
模拟这串数字的出入栈,如果当前读到的数字是7,那么7之前的数字肯定是在栈中或者在前一波中已经出栈了。
其中low就是来记录当前这一波入栈最小的值,然后每次入栈都判断下size是不是超过了m,超过即失败;以及如果当前的数字比low小,说明这个数字在前面已经被出栈了或是在栈中(不是栈顶元素),因此这种情况也是失败的。
#include<iostream>
#include<cstdio>
#include<stack>
#include<vector>
using namespace std;
int n,m,k;
int main(){
scanf("%d%d%d",&m,&n,&k);
int cnt, tmp, flag, low;
vector<int> num;
num.resize(n);
while(k -- > 0){
scanf("%d",&tmp);
for(int i = 1; i < n; ++i)
scanf("%d",&num[i]);
stack<int> stk;
cnt = 0;
flag = 1;
for(int i = 1; i <= tmp; ++i){
stk.push(i);
++cnt;
if(cnt > m){
flag = 0;
break;
}
}
if(!flag){
printf("NO\n");
continue;
}
low = stk.top() + 1;
stk.pop();
--cnt;
for(int i = 1; i < n; ++i){
tmp = num[i];
if(!stk.empty() && tmp== stk.top()){
stk.pop();
--cnt;
}
else{
for(int j = low; j < tmp; ++j){
stk.push(j);
++cnt;
if(cnt >= m){
flag = 0;
break;
}
}
if(low > tmp) flag = 0;
}
if(flag == 0) break;
low = max(tmp + 1, low);
}
if(!flag) printf("NO\n");
else printf("YES\n");
}
return 0;
}