导弹拦截
分析题意
找出最长不上升子序列和最长上升子序列
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=4e5+7;
ll a[N],dp1[N],dp2[N];
int main()
{
int n=0,len1=1,len2=1;
while(cin>>a[++n]);
n--;
dp1[1]=dp2[1]=a[1];
for(int i=2;i<=n;i++)
{
if(dp1[len1]>=a[i])
dp1[++len1]=a[i];
else
{
int p=upper_bound(dp1+1,dp1+len1+1,a[i],greater<int>())-dp1;
dp1[p]=a[i];
}
if(dp2[len2]<a[i])
dp2[++len2]=a[i];
else
{
int p=lower_bound(dp2+1,dp2+len2+1,a[i])-dp2;
dp2[p]=a[i];
}
}
cout<<len1<<endl<<len2<<endl;
return 0;
}