题目链接:点击打开链接
单调栈就是栈里的元素具有单调性,包括单调递增栈和单调递减栈。其实单调递增(减)栈就是每次碰到比栈顶元素小(大)的就出栈,保持栈里元素的单调性。
应用:可以快速求出距离每个元素左右两端最近且比其小(大)的元素的位置。
具体代码:
//复杂度为O(n)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
using namespace std;
typedef long long LL;
const int maxn = 1e5+100;
int A[maxn];
int R[maxn];//记录右边不小于该点高度的长度
int L[maxn];//记录左边
int main()
{
int n;
while(scanf("%d",&n)!=EOF&&n)
{
int i,j,k;
stack<int>s;
for(i=1;i<=n;i++)
{
scanf("%d",&A[i]);
while(!s.empty()&&A[s.top()]>A[i])
{
R[s.top()]=i-s.top()-1;
s.pop();
}
s.push(i);
}
while(!s.empty())
{
R[s.top()]=n-s.top();
s.pop();
}
for(i=n;i>0;i--)
{
while(!s.empty()&&A[s.top()]>A[i])
{
L[s.top()]=s.top()-i;
s.pop();
}
s.push(i);
}
while(!s.empty())
{
L[s.top()]=s.top();
s.pop();
}
LL ans=0;
for(i=1;i<=n;i++)
{
ans=max(ans,(LL)(R[i]+L[i])*A[i]);
// cout<<L[i]<<" "<<R[i]<<endl;
}
cout<<ans<<endl;
}
return 0;
}