最长非上升/非下降子序列(O(nlogn)非连续)

来源:互联网 发布:淘宝店铺质检报告没有 编辑:程序博客网 时间:2024/05/16 15:03

直接上代码,在其他大佬那看的·,当做个模板。

#include<stdio.h>#define N 101000int s[N],a[N],d[N];int f1(int x,int l,int r){    int m;    while(l<r)    {        m=(l+r)/2;        if(s[m]>x)        r=m;        else        l=m+1;    }    return l;}int f2(int x,int l,int r){    int m;    while(l<r)    {        m=(l+r)/2;        if(d[m]>=x)        l=m+1;        else        r=m;    }    return l;}int main(){    int ls,ld,i,j,t,n,ans;    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        for(i=1;i<=n;i++)        scanf("%d",&a[i]);        s[1]=d[1]=a[1];        ls=ld=1;        for(i=2;i<=n;i++)        {            if(a[i]>=s[ls])//上升序列             ans=++ls;            else            ans=f1(a[i],1,ls);            s[ans]=a[i];            if(a[i]<=d[ld])            ans=++ld;            else            ans=f2(a[i],1,ld-1);            d[ans]=a[i];        }        for(i=1;i<=ls;i++)//非下降子序列         printf("%d ",s[i]);        printf("\n");        for(i=1;i<=ld;i++)//非上升子序列         printf("%d ",d[i]);        printf("\n");    }    return 0; } 
原创粉丝点击