题意:没看题的具体意思,本质是求最长升序子序列的长度
#include<stdio.h>
#include<limits.h>
int c[40005],n;
int bin_find(int x) //二分查找
{
int l=0,r=n,mid=(l+r)/2;
while(l<=r){
if(x>c[mid])
l=mid+1;
else if(x<c[mid])
r=mid-1;
else
return mid;
mid=(l+r)/2;
}
return l;
}
int main()
{
int a[40005],T,i,j,len;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<=n;i++)
c[i]=INT_MAX;
c[0]=-1;
c[1]=a[0];
len=1;
for(i=1;i<n;i++){
j=bin_find(a[i]);
c[j]=a[i];
if(j>len)
len=j;
}
printf("%d\n",len);
}
return 0;
}
void path()
{
int i,j,k=len;
for(i=n-1;i>=1;i--){
j=bin_find(a[i]);
if(j==k)
b[k--]=i+1;
}
for(i=0;i<b[2]-1;i++)
if(a[i]<a[b[2]-1]){
b[1]=i+1;
break;
}
for(i=1;i<len;i++)
printf("%d ",b[i]);
printf("%d\n",b[len]);
}