AcWing 1017. 怪盗基德的滑翔翼
原题链接
简单
#include<iostream>
#include<algorithm>
using namespace std;
const int N=110;
int height[N];
int q1[N],h1,t1;
int q2[N],h2,t2;
//同时寻找最长上升子序列和最长下降子序列,并且取max
int m,n;
int main(){
cin>>m;
while(m--){
cin>>n;
for(int i=1;i<=n;i++)cin>>height[i];
t1=-1,t2=-1,h1=0,h2=0;
for(int i=1;i<=n;i++){
if(t1==-1||height[i]>q1[t1])q1[++t1]=height[i];
else{
int l=-1,r=t1+1;
while(l+1!=r){
int mid=(l+r)>>1;
if(q1[mid]>=height[i]){
r=mid;
}
else l=mid;
}
q1[r]=height[i];
}
if(t2==-1||height[i]<q2[t2])q2[++t2]=height[i];
else{
int l=-1,r=t2+1;
while(l+1!=r){
int mid=(l+r)>>1;
if(q2[mid]<=height[i]){
r=mid;
}else l=mid;
}
q2[r]=height[i];
}
}
cout<<max(t1+1,t2+1)<<endl;
}
}