SPOJ

来源:互联网 发布:口红哪个牌子好 知乎 编辑:程序博客网 时间:2024/05/16 14:08

题目连接:SPOJ - HISTOGRA- Largest Rectangle in a Histogram

题意是给定一个数组,要求找出其中的一个子区间[l,r],使得 length([l,r])min([l,r]) 最大。
L[i] 记录最大的 j 使得 j<ia[j]<a[i] 记录最小的 j,使得 j>ia[j]<a[i]
L[i] 可以用单调栈。
栈内从底到高值升序,下标升序。假设一个元素 a[j] 不在单调栈中且满足 j<ia[j]<a[i]k>j 使得 a[k]<a[i] 的 pop。
可以推广到所有偏序关系。

#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;}
原创粉丝点击