原题链接:https://www.dotcpp.com/oj/problem3248.html
知识点
单调栈
用单调递减栈,当该元素可以入栈的时候,栈顶元素就是它左侧第一个比它大的元素
解题思路
开两个数组,分别存左边第一个大于这个数的坐标和右边第一个大于这个数的坐标
之间的便是小于这两个数的,于是成员数量变为i-j+1
所以用o(n)的查询判断
AC代码
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int shu[N],sma[N],big[N];
int n;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>shu[i];
}
stack<int>stam,stab;
for(int i=n;i>=1;i--)//右边第一个大的
{
while(stam.size()&&shu[i]>shu[stam.top()])
{
stam.pop();
}
if(stam.size())
{
sma[i]=stam.top();
stam.push(i);
}
else
{
sma[i]=i;
stam.push(i);
}
}
for(int i=1;i<=n;i++)//左边第一个大的
{
while(stab.size()&&shu[i]>shu[stab.top()])
{
stab.pop();
}
if(stab.size())
{
big[i]=stab.top();
stab.push(i);
}
else
{
big[i]=i;
stab.push(i);
}
}
int maxx=2;
for(int i=3;i<=n;i++)
{
int t=max(i-big[i]+1,sma[i]-i+1);
maxx=max(t,maxx);
}
cout<<maxx;
return 0;
}