题目来源:http://poj.org/problem?id=3903
睡前水题一道 O(N*logN) 最长上升子序列
#include <iostream>
#include <cstdio>
#include <cstring>
#define MAXN 100010
using namespace std;
long long a[MAXN],b[MAXN];
int sum=1,n;
void find(int x)
{
int l=0,r=sum-1;
int mid=(l+r)/2;
while(l!=r)
{
if(b[mid]<x) {l=mid+1;mid=(l+r)/2;}
else {r=mid;mid=(l+r)/2;}
}
b[l]=x;
}
void solve()
{
for(int i=1; i<n; i++)
{
if(a[i]>b[sum-1]) {b[sum]=a[i];sum++;}
else find(a[i]);
}
}
int main()
{
while(~scanf("%d",&n))
{
for(int i=0; i<n; i++)
scanf("%lld",&a[i]);
b[0]=a[0];
solve();
printf("%d\n",sum);
sum=1;
}
}