题目连接:SPOJ - HISTOGRA- Largest Rectangle in a Histogram
题意是给定一个数组,要求找出其中的一个子区间
[l,r]
,使得
length([l,r])∗min([l,r])
最大。
设
L[i]
记录最大的
j
使得
同理,
R[i]
记录最小的
j
,使得
那么
ans=max(a[i]∗(R[i]−L[i]−1))
找
L[i]
可以用单调栈。
栈内从底到高值升序,下标升序。假设一个元素
a[j]
不在单调栈中且满足
j<i
且
a[j]<a[i]
。
那么必然存在单调栈中的
k
,
可以推广到所有偏序关系。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+7;
int n;
int h[N],L[N],R[N];
int main()
{
while(~scanf("%d",&n))
{
if(n==0) break;
for(int i=1;i<=n;i++) scanf("%d",&h[i]);
stack<int> s;
s.push(0); h[0]=-1;
for(int i=1;i<=n;i++)
{
while(!s.empty()&&h[s.top()]>=h[i]) s.pop();
L[i]=s.top();
s.push(i);
}
while(!s.empty()) s.pop();
s.push(n+1); h[n+1]=-1;
for(int i=n;i>=1;i--)
{
while(!s.empty()&&h[s.top()]>=h[i]) s.pop();
R[i]=s.top();
s.push(i);
}
ll ans=0;
for(int i=1;i<=n;i++)
ans=max(ans,1LL*(R[i]-L[i]-1)*h[i]);
printf("%lld\n",ans);
}
return 0;
}