首页 > 代码库 > poj2559单调栈

poj2559单调栈

给一系列并排的矩形,宽都是1,长不同,求最大的矩形(可被上述矩形覆盖)的面积

单调栈,栈中元素为每个值所在的位置,记录下从每个值大于当前值所能到达最远的左边和右边的距离,此时中间的值一定是最小,然后H*(R-L)即当前点所能覆盖的最大面积

技术分享
#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<cassert>
#include<iomanip>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define pi acos(-1)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#pragma comment(linker, "/STACK:1024000000,1024000000")

using namespace std;

const double g=10.0,eps=1e-9;
const int N=100000+10,maxn=5000+10,inf=0x3f3f3f3f;

ll q[N],a[N],l[N],r[N];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n;
    while(cin>>n,n){
        ll t=0;
        for(int i=0;i<n;i++)cin>>a[i];
        for(int i=0;i<n;i++)
        {
            while(t>0&&a[i]<=a[q[t-1]])t--;
            if(t>0)l[i]=q[t-1]+1;
            else l[i]=0;
            q[t++]=i;
        }
        t=0;
        for(int i=n-1;i>=0;i--)
        {
            while(t>0&&a[i]<=a[q[t-1]])t--;
            if(t>0)r[i]=q[t-1];
            else r[i]=n;
            q[t++]=i;
 //           cout<<r[i]<<endl;
        }
        ll ans=0;
        for(int i=0;i<n;i++)
            ans=max(ans,a[i]*(r[i]-l[i]));
        cout<<ans<<endl;
      //  cout<<ans<<endl;
    }
    return 0;
}
View Code

 

poj2559单调栈