题目大意:去掉一个数能不能构成不递增子序列或不递减序列
解体思路:就是正反两遍LIS(最长不递减子序列),如果len>=n-1的话就是,不然就不是
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=100005;
int a[N],f[N];
int bsearch(const int *f,int size,const int &a)
{
int l=0,r=size-1;
while(l<=r)
{
int mid=(l+r)/2;
if(a>=f[mid-1]&&a<f[mid])
return mid;
else if(a<f[mid])
r=mid-1;
else l=mid+1;
}
}
int LIS(const int *a,const int &n)
{
int i,j,size=1;
f[0]=a[0];
for(i=1;i<n;i++)
{
if(a[i]<f[0]) j=0;
else if(a[i]>=f[size-1]) j=size++;
else j=bsearch(f,size,a[i]);
f[j]=a[i];
}
return size;
}
int main()
{
int i,n;
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
int cnt1=LIS(a,n);
reverse(a,a+n);
int cnt2=LIS(a,n);
if(cnt1>=n-1)
{
printf("YES\n");
continue;
}
if(cnt2>=n-1)
{
printf("YES\n");
continue;
}
printf("NO\n");
}
return 0;
}