这题数据规模不大,不太想仔细分析数学规律,直接按模拟题来处理,简单模拟出栈、入栈的顺序即可。
#include<stdio.h>
#include<stack>
#include<vector>
using namespace std;
int main()
{
stack<int> S;
int M, N, K;
scanf("%d%d%d", &M, &N, &K);
for (int i = 0; i < K; i++)
{
while (S.empty() == false)
{
S.pop();
}
bool flag = true;
vector<int> input;
for (int j = 0; j < N; j++)
{
int tmp;
scanf("%d", &tmp);
input.push_back(tmp);
}
int before = input[0];
if (before > M)
{
printf("NO\n");
continue;
}
else
{
for (int k = 1; k < before; k++)
{
S.push(k);
}
}
int max = before;
for (int j = 1; j < N; j++)
{
int s = input[j];
if (s < before &&s == S.top())
{
S.pop();
}
else if (s > max)
{
for (int k = max + 1; k <= s; k++)
{
S.push(k);
}
if ((int)S.size() > M)
{
flag = false;
break;
}
S.pop();
max = s;
}
else
{
flag = false;
break;
}
before = s;
}
if (flag == false)
{
printf("NO\n");
}
else
{
printf("YES\n");
}
}
return 0;
}