原题链接: http://acm.hdu.edu.cn/showproblem.php?pid=5532
一:分析
求两次最长上升/下降子序列即可。
http://blog.youkuaiyun.com/chenwenshi/article/details/6027086
二:AC代码
#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int a[100005];
int s[100005];
int top;
int t;
int n;
bool judge()
{
top = 0;
for (int i = 0; i < n; i++)
{
int pos = upper_bound(s, s + top, a[i]) - s;
s[pos] = a[i];
top = max(top, pos + 1);
}
return top >= n - 1;
}
int main()
{
scanf("%d", &t);
while (t--)
{
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &a[i]);
bool flag = judge();
reverse(a, a + n);
flag |= judge();
printf("%s\n", flag ? "YES" : "NO");
}
return 0;
}