LIS的一种变形。
#include<cstdio>
#include<algorithm>
#include<cstring>
#define INF 1000000000+10
using namespace std;
const int maxn = 200010;
int num[maxn],l[maxn],r[maxn],g[maxn];
int main()
{
int T,n;
scanf("%d",&T);
while(T--)
{
memset(l,0,sizeof(l));
memset(r,0,sizeof(r));
memset(num,0,sizeof(num));
scanf("%d",&n);
for(int i=0; i<n; i++)
scanf("%d",&num[i]);
l[0]=1,r[n-1]=1;
for(int i=1; i<n; i++)
{
if(num[i]>num[i-1])
l[i]=max(1,l[i-1])+1;
else l[i]=1;
}
for(int i=n-2; i>0; i--)
{
if(num[i]<num[i+1])
r[i]=max(1,r[i+1])+1;
else r[i]=1;
}
for(int i=1; i<=n; i++)
g[i]=INF;
int cnt=0;
for(int i=0; i<n; i++)
{
int k=lower_bound(g,g+n,num[i])-g;
cnt=max(cnt,r[i]+k-1);
if(num[i]<g[l[i]])g[l[i]]=num[i];
}
printf("%d\n",cnt);
}
return 0;
}