这道题很简单,直接AC就可以了。
#include<iostream>
#include<cstring>
#include<cctype>
#include<cstdio>
#include<map>
#include<set>
#include<list>
#include<cstdlib>
#include<string>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
#include<cmath>
using namespace std;
int num1[200001],num2[200001],num[200001];
struct point
{
int a,b;
bool operator < (const point x)const
{
if(a!=x.a) return a<x.a;
else return b>x.b;
}
};
int main()
{
int T;
cin>>T;
while(T--)
{
int n,maxx=1,sum;
cin>>n;
set<point> s;
memset(num1,0,sizeof(num));
memset(num2,0,sizeof(num));
for(int i=0;i<n;i++) cin>>num[i];
for(int i=0;i<n;i++)
{
if(!i) num1[i]=1;
else
{
if(num[i]>num[i-1])
{
num1[i]=num1[i-1]+1;
}
else
{
num1[i]=1;
}
}
}
for(int i=n-1;i>=0;i--)
{
if(i==(n-1)) num2[i]=1;
else
{
if(num[i]<num[i+1])
{
num2[i]=num2[i+1]+1;
}
else
{
num2[i]=1;
}
}
}
for(int i=0;i<n;i++)
{
point p;
p.a=num[i];
p.b=1000000001;
set<point>::iterator jj=s.lower_bound(p);
if(jj!=s.begin())
{
jj--;
sum=(*jj).b+num2[i];
if(sum>maxx) maxx=sum;
}
p.a=num[i];
p.b=num1[i];
s.insert(p);
set<point>::iterator j=s.find(p);
if(j!=s.begin() && (*(--j)).b>=(*(++j)).b) s.erase(j);
else if((++j)!=s.end())
{
set<point>::iterator jjj=j;
j--;
for(set<point>::iterator k=jjj;k!=s.end();)
{
if((*j).a<(*k).a)
{
if((*k).b<=(*j).b)
{
s.erase(k++);
}
else break;
}
else
{
s.erase(k++);
}
}
}
}
if(n==0) maxx=0;
cout<<maxx<<endl;
}
}