注解
1、最长上升子序列的变形,正序和逆序分别扫描,只要其中最长上升子序列的个数大于等于N-1,就输出YES,否则输出NO。
代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1e5 + 5;
int a[maxn], dp[maxn];
int N;
int LIS() {
int top = 0;
for (int i = 0; i < N; i++) {
int pos = upper_bound(dp, dp + top, a[i]) - dp;
dp[pos] = a[i];
top = max(top, pos + 1);
}
return top;
}
int main() {
int T;
scanf("%d", &T);
for(int i=0; i<T; i++) {
scanf("%d", &N);
memset(dp, 0, sizeof(dp));
for(int j=0; j<N; j++) {
scanf("%d", &a[j]);
}
int len1 = LIS();
reverse(a, a+N);
memset(dp, 0, sizeof(dp));
int len2 = LIS();
if(len1>=N-1 || len2>=N-1){
printf("YES\n");
}
else{
printf("NO\n");
}
}
return 0;
}