#include <bits/stdc++.h>
#define endl '\n'
#define INF 0x3f3f3f3f
#define ll long long
#define Mirai ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
using namespace std;
const int N = 1e3 + 10;
int n,m,k;
int main()
{
Mirai;
cin>>n>>m>>k;
while(k--)
{
stack<int> s;
int t=1,x;
bool flag=true;
for(int i=0;i<n;i++)
{
cin>>x;
if(x==t)//x为当前需要的数字
{
t++;
while(s.size()&&s.top()==t)//只有x为当前需要的数字才需要在判断一次栈顶元素是否合法
//每次将不合法数值放入栈中后,栈顶元素一定是不合法的,所以只有当前数字合法时
//才能更新瓶顶元素,才需要重新判断栈顶是否合法
{
s.pop();//如果当前栈顶元素合法,弹出此元素
t++;
}
}
else//如果当前数字不合法
{
s.push(x);
if(s.size()>m)flag=false;//标记当前数组不合法,注意此处不能跳出,需要将剩余数字读完
//否则第一个测试点过不了
}
}
if(s.size()||!flag)cout<<"NO"<<endl;
else cout<<"YES"<<endl;
}
return 0;
}
此题跟插松枝类似,由于只需要按照顺序放入,所以可以用一个t来代表当前需要的数是多少,每放入一个数将t++就可以了
一到考试就犯浑,明明时多组输入,判断栈满时怎么能直接跳出呢!!!