今天数据结构课上老师 表扬了别的同学的PPT,无意之间看到了单调栈的新名词。
Poj 2559 HDU 1506 这两题一模一样,是很经典的单调栈问题。
单调栈是指一个栈中的元素始终保持某种顺序(非递增、非递减)。
#include <cstdio>
#include <stack>
#include <algorithm>
using namespace std;
int l[100005]={0};//i想左边遍历,第一个比它小的数的位置
int r[100005]={0};//i向右边遍历,第一个比它小的数的位置
int h[100005]={0};//记录直方图高度
int main()
{
int n;
long long maxs;
while(~scanf ("%d",&n)&&n)
{
stack <int> s;
for (int i=1;i<=n;i++)
{
scanf ("%d",&h[i]);
}
for (int i=1;i<=n;i++)
{
while (!s.empty()&&h[s.top()]>=h[i])//要使用while循环弹出比当前元素不小的元素位置
{
s.pop();
}
if (!s.empty())
l[i]=s.top();
else
l[i]=0;
s.push(i);
}
stack <int> p;
for (int i=n;i>=1;i--)
{
while(!p.empty()&&h[p.top()]>=h[i])
{
p.pop();
}
if (!p.empty())
r[i]=p.top();
else
r[i]=n+1;
p.push(i);
}
maxs=0;
for (int i=0;i<=n;i++)
{
//要使用long long 储存
maxs=max(maxs,(long long)(r[i]-l[i]-1)*h[i]);
}
printf("%lld\n",maxs);
}
return 0;
}