给定一个长度为 n� 的双端队列 a1,a2,…,an�1,�2,…,��。
作为双端队列,我们既可以从队列的左端弹出元素,也可以从队列的右端弹出元素。
我们希望弹出尽可能多的元素,并要求所有弹出元素按照弹出顺序进行排列,刚好可以构成一个严格递增的序列。
请你计算,最多可以弹出多少个元素。
输入格式
第一行包含整数 n�。
第二行包含 n� 个整数 a1,a2,…,an�1,�2,…,��。
输出格式
输出一个整数 k�,表示最大弹出元素数量。
数据范围
前 66 个测试点满足 1≤n≤101≤�≤10。
所有测试点满足 1≤n≤2×1051≤�≤2×105,1≤ai≤2×1051≤��≤2×105。
输入样例1:
5
1 2 4 3 2
输出样例1:
4
输入样例2:
7
1 3 5 6 5 4 2
输出样例2:
6
输入样例3:
3
2 2 2
输出样例3:
1
输入样例4:
4
1 2 4 3
输出样例4:
4
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 2e5+10;
int w[N];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>w[i];
int res=0,last=0;
for(int i=1,j=n;i<=j;)
{
if(w[i]!=w[j])
{
if(w[i]<w[j])
{
if(w[j]<=last)
break;
if(w[i]<=last)last=w[j--];
else last=w[i++];
res++;
}
else
{
if(w[i]<=last)
break;
if(w[j]<=last)last=w[i++];
else last=w[j--];
res++;
}
}
else
{
int left=0,right=0,cur=last;
for(int k=i;k<=j;k++)
{
if(w[k]>cur)cur=w[k],left++;
else break;
}
cur=last;
for(int k=j;k>=i;k--)
{
if(w[k]>cur)cur=w[k],right++;
else
break;
}
res+=max(left,right);
break;
}
}
cout<<res<<endl;
return 0;
}