Sample Input:
5 7 5
1 2 3 4 5 6 7
3 2 1 7 5 6 4
7 6 5 4 3 2 1
5 6 4 3 7 2 1
1 7 6 5 4 3 2
Sample Output:
YES
NO
NO
YES
NO
#include <iostream>
#include <vector>
using namespace std;
bool judge(vector<int> v, int m);
int main(void) {
int m, n, k;
scanf("%d%d%d", &m, &n, &k);
while (k--) {
int i = 0;
vector<int> v(n);
while (i < n)
scanf("%d", &v[i++]);
if (judge(v, m)) printf("YES\n");
else printf("NO\n");
v.clear();
}
return 0;
}
bool judge(vector<int> v, int m) {
int t = v[0], t1 = v[0], n = v.size();
for (size_t i = 0; i != n; ++i) {
if (v[i] >= t) {
t = v[i];
if (t - i > m) return false;
t1 = v[i];
}
else{
if(v[i] <= t1) t1 = v[i];
else return false;
}
}
return true;
}
//也可以用堆棧直接模擬
#include <stack>
#include <iostream>
using namespace std;
int main() {
int m, n, k;
scanf("%d%d%d", &m, &n, &k);
while (k--) {
bool flag = true;
stack<int> s;
int nt = n;
int j = 1;
while (nt--) {
int num;
scanf("%d", &num);
if (flag) {
while (s.empty() || s.top() != num) {
s.push(j++);
if (s.size() > m) { flag = false;break; }
}
if (flag && s.size() >= 1 && s.top() == num)
s.pop();
}
}
if (flag) printf("YES\n");
else printf("NO\n");
printf("---\n");
}
return 0;
}