hdu5532
题目
给出n个数,问如果去掉其中一个数,能否构成不上升或者不下降的序列。
思路
通过判断原数列的最长不上升(或者不下降)子序列的长度,如果长度len>=n-1,那就是YES,否则就是NO。用nlogn的算法。(原来非严格用的是upper_bound)
代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=1e5+10;
int a[maxn];
int f[maxn];
int n;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=0; i<n; i++)
scanf("%d",&a[i]);
int cnt=-1;
memset(f,0x3f,sizeof(f));
for(int i=0; i<n; i++)
{
int k=upper_bound(f,f+n,a[i])-f;
cnt=max(cnt,k);
f[k]=a[i];
}
if(cnt>=n-2)
{
printf("YES\n");
continue;
}
cnt=-1;
memset(f,0x3f,sizeof(f));
for(int i=n-1; i>=0; i--)
{
int k=upper_bound(f,f+n,a[i])-f;
cnt=max(cnt,k);
f[k]=a[i];
}
if(cnt>=n-2)
{
printf("YES\n");
continue;
}
printf("NO\n");
}
return 0;
}