#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std;
const int maxn=200000+5;
int a[maxn],f[maxn],g[maxn];
int n;
struct Jason{
int a,g;
Jason(int a,int g): a(a),g(g) {}
bool operator < (const Jason &rhs) const {
return a<rhs.a;
}
};
void get_L()
{
g[0]=1;
for(int i=1;i<n;i++){
if(a[i]>a[i-1]) g[i]=g[i-1]+1;
else g[i]=1;
}
f[n-1]=1;
for(int i=n-2;i>=0;i--){
if(a[i+1]>a[i]) f[i]=f[i+1]+1;
else f[i]=1;
}
}
int solve()
{
int ans=1;
set<Jason> s;
s.insert(Jason(a[0],g[0]));
for(int i=1;i<n;i++)
{
Jason c(a[i],g[i]);
set<Jason>::iterator it;
it=s.lower_bound(c);
bool keep=true;
if(it!=s.begin())
{
Jason last=*(--it);
int len=last.g+f[i];
ans=max(ans,len);
if(c.g<=last.g) keep=false;
}
if(keep)
{
s.erase(c);
s.insert(c);
it=s.find(c);it++;
while(it!=s.end()&&it->a>c.a&&it->g<=c.g) s.erase(it++);
}
}
return ans;
}
#define ss(x) scanf("%d",&x)
int main()
{
int t;ss(t);
while(t--)
{
ss(n);
for(int i=0;i<n;i++) ss(a[i]);
get_L();
printf("%d\n",solve());
}
}
UVA 1471 Defense Lines(set维护二元组单调队列)
最新推荐文章于 2021-12-24 18:21:53 发布