版权声明:本文为博主原创文章,未经博主允许不得转载。 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);
}