保持当前遇到的最大值,小于此最大值的最小值,小于等于此最大值的数字个数,当出现一个新的最大值,其右侧(即随后出栈的)比它小的数字是降序的,总个数不能超出容量,复杂度O(n)
#include<iostream>
#include<string>
using namespace std;
int m,n,k,val[2222];
int main(){
cin>>m>>n>>k;
while(k--){
int mmax=-1,size,mmin,fail=false;
for(int i=0,tmp;i<n;++i){
cin>>tmp;
if(tmp>mmax)mmax=tmp,size=1,mmin=tmp;
else if(tmp>mmin) fail=true;
else if(size<m) mmin=tmp,++size;
else fail=true;
}//for
cout<<(fail?"NO":"YES")<<endl;
}//while
}