LIS(模板)

贪心+二分
显然其结尾元素越小,越有利于在后面接其他的元素,也就越可能变得更长
所以我们不断更新(答案)序列中元素,使之更有利于后面答案

#include<bits/stdc++.h>
#define re return
#define inc(i,l,r) for(int i=l;i<=r;++i)
const int maxn=100005,maxm=2005;
using namespace std;
template<typename T>inline void rd(T&x)
{
	char c;bool f=0;
	while((c=getchar())<'0'||c>'9')if(c=='-')f=1;
	x=c^48;
	while((c=getchar())>='0'&&c<='9')x=x*10+(c^48);
	if(f)x=-x;
}

int f[maxn],k,n;

int main()
{
	int x;
	rd(n);
	inc(i,1,n)
	{
		rd(x);
		if(x>f[k])f[++k]=x;
		else
		{
			int l=1,r=k;
			while(l<=r)
			{
				int mid=(l+r)>>1;
				if(f[mid]<x)l=mid+1;
				else r=mid-1;
			}
			
			f[l]=x;
		} 
	}
	printf("%d",k);
}
posted @ 2019-08-01 21:34  凉如水  阅读(324)  评论(0编辑  收藏  举报