要使用二分法,否则肯定超时。40ms AC
#include<cstdio>
#include<cstring>
///最长升序子序列
int main()
{
int i,j;
int b[40005];
int a[40005];
int n,m;
int mp;
scanf("%d",&n);
while(n--)
{
scanf("%d",&m);
for(i=0; i<m; i++)
scanf("%d",&a[i]);
mp=1;
memset(b,0,sizeof(b));
b[1]=a[0];
for(i=0; i<m; i++)
{
int l=0,r=mp,mid; ///二分
while(l<=r)
{
mid=(l+r)/2;
if(b[mid]<a[i])
l=mid+1;
else
r=mid-1;
}
b[l]=a[i];
if(l>mp) mp++;
}
printf("%d\n",mp);
}
return 0;
}