# 最长上升子序列 O(NlogN)做法

f[i]=x记录的是长度为i的上升子序列中,最后一个值最小的那个序列。那么f[]数组一定是递增的。
对于每个数y,使用二分法找到第一个大于y的f[i],将这个值更新为y,

#include <bits/stdc++.h>
using namespace std;

const int maxn=1e5+5;
int a[maxn];
int f[maxn];
int cnt,n,x;
inline int find(int x){
	int l=1,r=cnt,m;
	while(l<r){
		m=l+r>>1;
		if(f[m]<x)l=m+1;
		else r=m;
	}
	return l;
}
int main(){
	cin>>n;
	for(int i=0;i<n;++i)cin>>a[i];

	f[++cnt]=a[0];
	for(int i=1;i<n;i++){
		x=a[i];
		if(x>f[cnt])f[++cnt]=x;
		else {
			f[find(x)]=x;
		}
	}
	cout<<cnt<<endl;
	return 0;
}
posted @ 2020-07-14 10:53  yhsmer  阅读(175)  评论(0编辑  收藏  举报