代码如下:
#include <iostream>
#include <stack>
#include <vector>
using namespace std;
int M, N, K;
stack<int> s;
bool isPopSeq(vector<int>& seq){
int cnt = 0; // count push times
stack<int> s;
int firstNum = seq[0];
if(s.empty()){
for(int i = 1; i <= firstNum; i++){
s.push(i);
cnt++;
}
if(s.size() > M) return false;
}
for(int i = 0; i < seq.size(); i++){
if(s.empty() || s.top() != seq[i]){
for(int j = cnt + 1; j <= seq[i]; j++){
s.push(j);
cnt++;
}
if(s.size() > M) return false;
}
if(s.top() == seq[i]) s.pop();
}
return s.empty();
}
int main(){
cin >> M >> N >> K;
for(int i = 1; i <= K; i++){ // check K pop sequences
vector<int> seq;
for(int i = 0; i < N; i++){
int num;
cin >> num;
seq.emplace_back(num);
}
if(isPopSeq(seq))
cout << "YES" << endl;
else
cout << "NO" << endl;
}
return 0;
}
因为是按1-N的顺序入栈,所以如果一个出栈的数是M,那么M之前绝不可能有比它大的元素。代码中cnt记录了进行了入栈次数,如果一个数要进栈,必须要让小于它的先进栈。