poj2533 LIS裸题 O(nlogn)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zz_ylolita/article/details/81101271
/*O(nlogn) LIS
d[i]表示使得f[i]为i的最小的a[i]
!!! d[]的初始值为INF
d[]单调递增
证明:反证,假设d[]不单增,与定义矛盾
二分查找d[]中不大于a[i]的最大元素,返回下标
poj 2533
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
#define N 300005
int d[N],f[N];
int ans,n;
int a[N];
int bifind(int l,int r,int x)
{
	int mid;
	while (r - l > 1)
	{
		int mid = (l+r) >> 1;
		if (d[mid] < x) 
			l = mid;
		else r = mid-1;
	}
	if(d[r] < x) return r; else if (d[l] < x) return l; else return 0;
}


int main()
{
	scanf("%d", &n);
	for (int i=1;i<=n;i++)
		scanf("%d", &a[i]);
	memset(d,0x3f, sizeof(d));
	d[1] = a[1];
	f[1] = ans = 1;
	for (int i=2;i<=n;i++)
	{
		f[i] = bifind(1,ans,a[i]) + 1;
		d[f[i]] = min(d[f[i]], a[i]);
		ans = max(ans, f[i]);
	}
	printf("%d\n", ans);
}

猜你喜欢

转载自blog.csdn.net/zz_ylolita/article/details/81101271