直接上代码,在其他大佬那看的·,当做个模板。
#include<stdio.h>
#define N 101000
int 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;
}