记录下模板
#include <map>
#include <queue>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#define maxn 70000
using namespace std;
int b[maxn],dp[maxn];
int find_it(int x,int len){
int l,r,m;
l=1,r=len;
while(l<r){
m=(l+r)>>1;
if(dp[m]>=b[x])r=m;
else l=m+1;
}
return l;
}
int main(){
int t,n,la,lb,cnt=1,tmp;
while(~scanf("%d",&n)){
for(int i=1;i<=n;++i)scanf("%d",&b[i]);
tmp=1;
dp[1]=b[1];
for(int i=2;i<=n;++i)
if(b[i]>dp[tmp])
dp[++tmp]=b[i];
else{
int pos=find_it(i,tmp);
dp[pos]=b[i];
}
printf("%d\n",tmp);
}
return 0;
}
/*
1
3 6 7
1 7 5 4 8 3 9
1 4 3 5 6 2 8 9
*/
更简洁的///严格递增
#include <map>
#include <queue>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#define maxn 70000
using namespace std;
int b[maxn],dp[maxn];
int main(){
int t,n,la,lb,cnt=1,tmp;
while(~scanf("%d",&n)){
for(int i=1;i<=n;++i)scanf("%d",&b[i]);
tmp=0;
for(int i = 1; i <= n; i ++){
int pos=lower_bound(dp,dp+tmp,b[i])-dp;
dp[pos]=b[i];
if(pos==tmp)
tmp++;
}
printf("%d\n",tmp);
}
return 0;
}
/*
1
3 6 7
1 7 5 4 8 3 9
1 4 3 5 6 2 8 9
*/