1、题目链接:[NOIP1999 提高组] 导弹拦截 - 洛谷
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int a[N],x,n;
int b[N],len;
int main(){
while(cin>>x)a[++n]=x;
//求最长不上升子序列
b[0]=2e9;//初始化为无穷大
for(int i=1;i<=n;i++){
if(a[i]<=b[len])b[++len]=a[i];//小则添加
else{
int l=1,r=len;
while(l<r){
int mid=l+r>>1;
if(a[i]>b[mid])r=mid;
else l=mid+1;
}
b[l]=a[i];
}
}
cout<<len<<endl;
len=0;
//求最长上升子序列
b[0]=-2e9;
for(int i=1;i<=n;i++){
if(a[i]>b[len])b[++len]=a[i];
else{
int l=1,r=len;
while(l<r){
int mid=l+r>>1;
if(b[mid]>=a[i])r=mid;
else l=mid+1;
}
b[l]=a[i];
}
}
cout<<len<<endl;
return 0;
}