单调栈
单调递增栈:数据出栈的序列为单调递增序列;
单调递减栈:数据出栈的序列为单调递减序列;
注意:递增递减是出栈的顺序,不是栈中数据的顺序;只用到它的一端;
简单理解:
一组数从左到右依次入栈,如果栈为空或入栈元素小于栈顶元素,则入栈;否则破坏单调性,则需要把比入栈元素小或大的元素全部出栈。
eg:
10 3 7 4 12
10入栈 栈元素为:10
3入栈 栈元素为:10 3
7入栈 栈元素为:10 7
4入栈 栈元素为:10 7 4
12入栈 栈元素为:12
应用:
求最大矩形面积
https://www.acwing.com/problem/content/133/
我们就可以理解:以高度为数据,将第一个元素入栈,如果接下来的元素如果比栈顶元素大,不违反单调递增,我们直接入栈;如果接下来的元素比栈顶元素小,我们就留下它们的宽度,然后宽度乘以高度更新答案,在丢掉高度。
完整代码
#include<stdio.h>
int main()
{
int n,p;
int a[100010];
int s[100010],w[100010];
int ans;
while(~scanf("%d",&n))
{
if(n==0)
break;
ans=0;
p=0;
for(int i=1; i<=n; i++)
scanf("%d",&a[i]);
a[n+1]=0;
for(int i=1; i<=n+1; i++)
{
if(a[i]>s[p])
{
s[++p]=a[i];
w[p]=1;
}
else
{
int l=0;
while(s[p]>a[i])
{
l+=w[p];
if(ans<l*s[p])
ans=l*s[p];
p--;
}
s[++p]=a[i];
w[p]=l+1;
}
}
printf("%d\n",ans);
}
return 0;
}