思路:遍歷每個序列,遍歷時維護一個值maxn(已遍歷過的數中的最大數),maxn初始值爲0。
對於每個數字 i:
1、若 i 大於maxn,則往棧中push 【maxn+1,i】之間的數(端點值要取),接下來判斷是否超出容量,超出則不能構成該序列。
若未超出,則pop棧頂的值(即 i),同時 令maxn=i。
2、若 i 小於maxn,則查看棧頂的值是否等於 i ,不是則不能構成該序列,是則pop棧頂值。
#include <iostream>
#include <stack>
#include <vector>
#include <stdio.h>
using namespace std;
int maxin,m,n,k;
int main()
{
cin>>m>>n>>k;
for(int i=0;i<k;i++){
vector<int> seq;
stack<int> st;
maxin=0;
for(int j=0;j<n;j++){
int data;
scanf("%d",&data);
seq.push_back(data);
}
bool flag=true;
for(int h=0;h<seq.size();h++){
if(seq[h] > maxin){
for(int i=maxin+1;i<=seq[h];i++){
st.push(i);
}
if(st.size()>m){
flag=false;
break;
}
maxin=seq[h];
st.pop();
}else{
if(st.top()==seq[h]){
st.pop();
}else{
flag=false;
break;
}
}
}
if(flag) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}