/*单个数据均合法通过代码*/
#include<iostream>
#include<stack>
using namespace std;
int main(){
int msize;
int isize;
int num;
stack<int>stk;
// int currlen;
cin>>msize;
cin>>isize;
cin>>num;
int arr[isize];
int thearr[isize*num];
int isout[isize+1];
for(int i=0;i<isize;++i){
cin>>arr[i];
isout[i+1]=0;
}
for(int i=0;i<isize;++i){
int j;
int top;
if(stk.size()==0){
top=0;
}
else {
top=stk.top();
}
if(top<arr[i]){
j=arr[i]-top;
for(int k=1;k<=j;++k){
if(!isout[top+k]){
stk.push(top+k);
}
}
int currlen=stk.size();
if(currlen>msize||stk.top()!=arr[i]){
cout<<"NO"<<endl;
return 0;
}
isout[stk.top()]=1;
stk.pop();
}
else if(top==arr[i]){
isout[stk.top()]=1;
stk.pop();
}
else if(stk.top()>arr[i]){
cout<<"NO"<<endl;
return 0;
}
}
cout<<"YES"<<endl;
return 0;
}
/*批量数据代码*/
#include<iostream>
#include<stack>
#include<vector>
using namespace std;
int main(){
int msize;
int isize;
int num;
stack<int>stk;
// int currlen;
cin>>msize;
cin>>isize;
cin>>num;
int arr[isize];
vector<int>data;
int isout[isize+1];
int number;
for(int i=0;i<isize*num;++i){
cin>>number;
data.push_back(number);
}
int isdone;
for(int m=0;m<num;++m){
for(int i=0;i<isize;++i){
arr[i]=data[m*isize+i];
isout[i+1]=0;
}
isdone=0;
for(int i=0;i<isize;++i){
int j;
int top;
if(stk.size()==0){
top=0;
}
else {
top=stk.top();
}
if(top<arr[i]){
j=arr[i]-top;
// cout<<"j="<<j<<endl;
for(int k=1;k<=j;++k){
if(!isout[top+k]){
stk.push(top+k);
}
}
int currlen=stk.size();
// cout<<"size="<<currlen<<"top="<<stk.top()<<endl;
if(currlen>msize||stk.top()!=arr[i]){
cout<<"NO"<<endl;
isdone=1;
break;
}
isout[stk.top()]=1;
stk.pop();
}
else if(top==arr[i]){
isout[stk.top()]=1;
stk.pop();
}
else if(top>arr[i]){
cout<<"NO"<<endl;
isdone=1;
break;
}
}
if(!isdone){
cout<<"YES"<<endl;
}
// 最后一个障碍在这里,单个都能通过,但是批量处理出现问题,原因是前一次运算中栈留下的元素没有清空。
while(!stk.empty()){
stk.pop();
}
}
return 0;
}
总结
1、使用容器和容器适配器要时刻关注边界,不要溢出
栈空的时候使用top,pop都会错误。
2、在批量处理数据时,注意处理每一批数据的初始条件,上一次处理是否改变了某些变量,是否在容器留下了数据。
注意清空容易和重置变量。