896. 最长上升子序列 II
题目链接https://www.acwing.com/problem/content/898/
题目:
思路:在队列里求出小于t的最大的一个数的下标。a[0]初始化最小值,确保输入的数一定在二分时在a[0]的右边
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int a[100010],k;
int erfen(int u){
int l=0,r=k;
while(l<r){
int mid=l+r+1>>1;
if(a[mid]<u) l=mid;
else r=mid-1;
}
return l;
}
int main(){
int n;
cin>>n;
a[0]=-1e9-10;
for(int i=0;i<n;i++){
int t;
scanf("%d",&t);
int index=erfen(t);
a[++index]=t;
k=max(k,index);
}
cout<<k;
return 0;
}