O(n*logn)二分优化
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
int num[100005];
int dp[100005];
bool cmp(int a,int b){
if(a>b)return true;
return false;
}
int main(){
int n;
while(cin>>n){
for(int i=1;i<=n;i++){
scanf("%d",&num[i]);
}
dp[0]=inf;
int cnt=0;
for(int i=1;i<=n;i++){
if(dp[cnt]>=num[i]){
cnt++;
dp[cnt]=num[i];
}
else {
int t=upper_bound(dp+1,dp+cnt+1,num[i],cmp)-dp;//最长非递增子序列 (可重复)
dp[t]=num[i];
}
}
cout<<cnt<<endl;
dp[0]=0;
cnt=0;
for(int i=1;i<=n;i++){
if(dp[cnt]<num[i]){
cnt++;
dp[cnt]=num[i];
}
else {
int t=lower_bound(dp+1,dp+cnt+1,num[i])-dp;//最长严格递增子序列
dp[t]=num[i];
}
}
cout<<cnt<<endl;
}
return 0;
}