您的位置:首页 > 其它

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

2017-10-19 16:13 253 查看
直接上代码,在其他大佬那看的·,当做个模板。

#include<stdio.h>
#define N 101000
int s
,a
,d
;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: