这是O(N²)的算法
求各位大佬改成O(N log N)的算法
#include<bits/stdc++.h>
using namespace std;
int main(){
int n=0,m=0;
int a[100001];//飞来的导弹高度
int b[100001];//最长下降子序列的长度
int height[100001];//每个拦截系统还能拦截的高度
height[0]=50005;
for(int i=1;cin>>a[i];i++){
int maxx=0;//最大高度
//计算前i-1个导弹以a[i]最后一个的最长下降子序列
for(int j=1;j<i;j++){
if(a[j]>=a[i] && b[j]>maxx)
maxx=max(b[j],maxx);
}
b[i]=maxx+1;
m=max(b[i],m);
//飞过来一个导弹找最优拦截系统,找不到拦截系统加一
int x=0;//最优拦截系统下标
for(int j=1;j<=n;j++){
if(height[j]>=a[i]&&height[j]<height[x]){
x=j;
}
}
if(x==0){
n++;
x=n;
}
height[x]=a[i];
}
cout<<m<<endl<<n<<endl;
return 0;
}