玄学:求一个序列里面最少有多少最长不上升序列等于求这个序列里最长上升序列的长度
#include<bits/stdc++.h> using namespace std; const int N=1e5+10; int a[N],ans[N]; int main(){ int n; while(~scanf("%d",&n)){ for(int i=1;i<=n;i++) scanf("%d",&a[i]); int len=1;ans[1]=a[1]; for(int i=2;i<nn;i++){ if(a[i]>ans[len]) ans[++len]=a[i]; else{ int pos=lower_bound(ans+1,ans+len+1,a[i])-ans; ans[pos]=a[i]; } } } //cout<<nn<<endl; int len=1;ans[1]=a[1]; for(int i=2;i<nn;i++){ if(a[i]>ans[len]) ans[++len]=a[i]; else{ int pos=lower_bound(ans+1,ans+len+1,a[i])-ans; ans[pos]=a[i]; } } memset(ans,0,sizeof(ans)); //最长不下降子序列 int len_=1;ans[len_]=-a[1]; for(int i=2;i<nn;i++){ if(-a[i]>=ans[len_]) ans[++len_]=-a[i]; else{ int pos=upper_bound(ans+1,ans+len_+1,-a[i])-ans; ans[pos]=-a[i]; } } cout<<len_<<" "<<len<<endl; return 0; }