AcWing 1017. 怪盗基德的滑翔翼
原题链接
简单
作者:
unsugar
,
2024-10-10 16:02:38
,
所有人可见
,
阅读 2
// Problem: 怪盗基德的滑翔翼
// Contest: AcWing
// URL: https://www.acwing.com/problem/content/1019/
// Memory Limit: 64 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)
//易证:无论站在哪,再怎么选,长度都不可能超过整个序列的最长上升子序列长度或最长下降子序列长度
//#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+10;
int n,m;
int a[N];
void solve(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
//nlogn求最大上升子序列长度
vector<int>v;
for(int i=1;i<=n;i++){
int p=lower_bound(v.begin(),v.end(),a[i])-v.begin();
if(p==v.size())v.push_back(a[i]);
else v[p]=a[i];
}
int up=v.size();//记录长度
//懒得修改二分函数,全部取反再求一次最长上升,等于取反前的最长下降
for(int i=1;i<=n;i++){
a[i]=-a[i];
}
v.clear();
v.push_back(a[1]);
for(int i=1;i<=n;i++){
int p=lower_bound(v.begin(),v.end(),a[i])-v.begin();
if(p==v.size())v.push_back(a[i]);
else v[p]=a[i];
}
int dn=v.size();//记录最长下降长度
//cout<<up<<" "<<dn<<endl;
cout<<max(dn,up)<<endl;//输出两个长度中最大的一个
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int _=1;
cin>>_;
for(int i=1;i<=_;i++){
solve();
}
}