http://acm.hdu.edu.cn/showproblem.php?pid=1950
LIS问题:O(nlog(n))二分的算法
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int lmax=40005;
int a[lmax],dp[lmax];
int main()
{
//freopen("1.txt","r",stdin);
int T,n,i,j,k;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(i=1;i<=n;i++) scanf("%d",a+i);
int len=0,ans=0;
for(i=1;i<=n;i++)
{
int lft=1,rht=len,mid;
while(lft<=rht)
{
mid=(lft+rht)/2;
if(dp[mid]<a[i]) lft=mid+1;
else rht=mid-1;
}
dp[lft]=a[i];
if(len<lft) len=lft;
if(ans<len) ans=len;
}
/*
for(i=1;i<=n;i++)
{
int k=lower_bound(dp,dp+len,a[i])-dp;
dp[k++]=a[i];
if(len<k) len=k;
if(ans<len) ans=len;
}
*/
printf("%d\n",ans);
}
}