非严格递增递减要求使用upper_bound()

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 1e5 + 10;
int T, N, a[MAXN], b[MAXN];
int LIS() {
int cnt = 0; b[++cnt] = a[1];
for (int i = 2; i <= N; i++) {
if (a[i] >= b[cnt]) b[++cnt] = a[i];
else {
int pos = upper_bound(b + 1, b + cnt, a[i]) - b;
b[pos] = a[i];
}
}
return cnt;
}
int main() {
scanf("%d", &T);
for (int kase = 1; kase <= T; kase++) {
scanf("%d", &N);
for (int i = 1; i <= N; i++) scanf("%d", &a[i]);
bool ok = false;
if (LIS() >= N - 1) ok = true;
reverse(a + 1, a + 1 + N);
if (LIS() >= N - 1) ok = true;
if (ok) printf("YES\n");
else printf("NO\n");
}
return 0;
}