题目描述
给定一个长度为的数组,问其中的最长上升子序列的长度。
所有数据保证。
分析
:表示上升子序列为的最后一个元素的最小值
如果,那么
否则,从进行二分,将存入
为当前最长上升子序列
AC代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int n,len,a[maxn],c[maxn];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++){
if(a[i]>c[len])
c[++len]=a[i];
else{
int l=0,r=len;
while(l+1<r){
int mid=(l+r)/2;
if(c[mid]<a[i])
l=mid;
else
r=mid;
}
c[r]=a[i];
}
}
printf("%d",len);
}