LIS+二分法

时间:2023-03-10 05:23:48
LIS+二分法

http://poj.org/problem?id=3903

数列里是存从小到大排的数,二分也是为了这个服务的,不断更新。而len才是所求长度

 #include <iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#define mem(a) memset(a,0,sizeof(a))
using namespace std; int main()
{
int t,a[],f[];
while(cin>>t)
{
for(int i=;i<t;i++)
{
scanf("%d",&a[i]);
}
f[]=-;
int len=,l,r,mid;
for(int i=;i<t;i++)
{
if(a[i]>f[len]) f[++len]=a[i];
else
{
l=,r=len;
while(l<=r)
{
mid=((l+r)>>);
if(f[mid]>=a[i]) r=mid-;
else l=mid+;
}
f[l]=a[i]; //因为执行l=mid+1的条件就是a[i]大于mid了所以到最后正好能被替换掉的下标就是l或者r+1
}
}
cout<<len<<endl; }
return ;
}