给定n个矩形的高,宽恒为1,求最大的矩形面积。
题意看HDU1506
=_=不会做..
搜到一些题解才看懂…
用单调栈维护第i个点往右和往左能扩展到的位置。
单调栈用来解决: 求出距离每个元素左右两端最近且比其小(大)的元素的位置。
思路:找到每个点往右扩展第一个比他小的值d[j],这样就能找到第i个点最远能扩展到 j-1这个位置。
同理,也能按这方法往左找。
#include <iostream>
#include <cstdio>
#include <stack>
using namespace std;
typedef long long LL;
int d[100005];
int R[100005];
int L[100005];
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif // LOCAL
int n,k;
while(scanf("%d",&n),n)
{
stack<int> S;
for(int i=0;i<n;i++)
scanf("%d",&d[i]);
for(int i=0;i<n;i++)
{
while(!S.empty()&&d[S.top()]>d[i])
{
R[S.top()]=i-1;
S.pop();
}
S.push(i);
}
if(!S.empty())
k=S.top();
while(!S.empty())
{
R[S.top()]=k;
S.pop();
}
for(int i=n-1;i>=0;i--)
{
while(!S.empty()&&d[S.top()]>d[i])
{
L[S.top()]=i+1;
S.pop();
}
S.push(i);
}
if(!S.empty())
k=S.top();
while(!S.empty())
{
L[S.top()]=k;
S.pop();
}
LL ans=0;
for(int i=0;i<n;i++)
{
ans=max(ans,(LL)(R[i]-L[i]+1)*(LL)d[i]);
}
cout<<ans<<endl;
}
return 0;
}