F--Almost Sorted Array(2015-ACM-ICPC长春站)

来源:互联网 发布:网络打印机经常脱机 编辑:程序博客网 时间:2024/05/17 03:51

题目大意:去掉一个数能不能构成不递增子序列或不递减序列

解体思路:就是正反两遍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;}


0 0
原创粉丝点击