#include<stdio.h>
#include<string.h>
#define MAX 1000000
#define INF 100000000
int a[MAX],c[MAX],len,n;
int findd(int L,int R,int x)
{
if(L==R)
return L;
int mid=(L+R)>>1;
if(c[mid]<x)
return findd(mid+1,len,x);
else
return findd(L,mid,x);
}
int main()
{
int t,j;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
len=0;
c[0]=-INF;
for(int i=0;i<n;i++)
{
if(a[i]>c[len])
j=++len;
else
j=findd(1,len,a[i]);
c[j]=a[i];
if(i!=n-1)
printf("%d ",j);
else
printf("%d\n",j);
}
}
return 0;
}
最长上升子序列
最新推荐文章于 2025-04-03 12:29:13 发布