#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn = 100010;
int a[maxn], n;
int dp_up[maxn], num_up[maxn];
int dp_down[maxn], num_down[maxn];
void GetAns(int dp[], int num[])
{
vector<int> v;
v.push_back(a[n]);
for(int i = n-1; i >= 1; i --)
{
int sz=v.size();
if(a[i] > v[sz - 1])
{
v.push_back(a[i]);
dp[i] = sz + 1;
num[i] = 1;
}
else if(a[i] == v[sz-1])
{
vector<int>::iterator iter;
iter = upper_bound ( v.begin(), v.end(), a[i] );
dp[i] = iter - v.begin() + 1;
v.push_back(a[i]);
pair<vector<int>::iterator, vector<int>::iterator> bounds;
bounds = equal_range(v.begin(), v.end(), a[i]);
num[i] = bounds.second - bounds.first;
}
else
{
vector<int>::iterator iter;
iter = upper_bound(v.begin(),v.end(),a[i]);
dp[i] = iter - v.begin() + 1;
*iter = a[i];
pair<vector<int>::iterator, vector<int>::iterator> bounds;
bounds = equal_range(v.begin(), v.end(), a[i]);
num[i] = bounds.second -bounds.first;
}
}
}
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
for(int i = 1; i <= n; i ++)
{
scanf("%d",&a[i]);
}
GetAns(dp_up,num_up);
for(int i = 1; i <= n; i ++)
{
a[i] = -a[i];
}
GetAns(dp_down,num_down);
int maxans=0;
for(int i = 1; i <= n; i ++)
{
maxans=max(maxans,dp_up[i]+dp_down[i]-min(num_up[i],num_down[i]));
}
printf("%d\n",maxans);
}
return 0;
}
HDU 4604 Deque
最新推荐文章于 2019-10-01 10:52:24 发布