#include<bits/stdc++.h>
#define MAX 100010
using namespace std;
int a[MAX],b[MAX],c[MAX],now,cnt;
int main(){
while(cin>>now){
cnt++;
c[cnt] = now;
}
int len1 = 1,len2 = 1;
a[len1] = c[1]; b[len2] = c[1];
for(int i=2;i<=cnt;i++){
int p = upper_bound(a+1,a+len1+1,c[i],greater<int>() )-a;
if(a[len1] >=c[i] ){
len1++;
a[len1] = c[i];
} else{
a[p] = c[i];
}
int m = lower_bound(b+1,b+len2+1,c[i])-b;
if(b[len2] < c[i]){
len2++;
b[len2] = c[i];
}else{
b[m] = c[i];
}
}
cout<<len1<<endl<<len2<<endl;
}
o(nlogn)复杂度的最长上升子数列——洛谷P1020(纯代码)
最新推荐文章于 2023-11-24 20:50:36 发布