//紫书P242
//UVA1471Defense Lines
//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<set>
using namespace std;
const int maxn=2e5+10;
int t,n,a[maxn],f[maxn],g[maxn];
int aa=0;char c;
int read()
{
aa=0;c=getchar();
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') aa=aa*10+c-'0',c=getchar();
return aa;
}
struct node
{
int a,g;
node(const int a=0,const int g=0) : a(a),g(g){}
bool operator < (const node& b) const {
return a<b.a;
}
};
int main()
{
int ans;
t=read();
while(t--) {
n=read();
for(int i=0;i<n;++i) a[i]=read();
if(n==1) {cout<<n<<"\n";continue;}
g[0]=1;f[n-1]=1;
for(int i=1;i<n;++i) if(a[i]>a[i-1]) g[i]=g[i-1]+1; else g[i]=1;
for(int i=n-2;i>=0;--i) if(a[i]<a[i+1]) f[i]=f[i+1]+1; else f[i]=1;
set<node> G; G.insert(node(a[0],g[0])); ans=1;
set<node> :: iterator it;
for(int i=1;i<n;++i) {
bool ok=1;
node v=node(a[i],g[i]);
it=G.lower_bound(v);
if(it!=G.begin()) {
it--;
int len=it->g+f[i];
ans=max(ans,len);
if(it->g>=g[i]) ok=0;
}
if(ok){
G.erase(v); G.insert(v);
it=G.find(v); it++;
while(it!=G.end()&&it->g<=v.g) G.erase(it++);
}
}
printf("%d\n",ans);
}
return 0;
}
防线Defense Lines
最新推荐文章于 2022-08-18 18:56:02 发布