poj 2082 单调栈 ***

和poj2082差不多,加了一个宽度的条件

#include<iostream>

#include<string>

#include<cmath>

#include<cstdio>

#include<algorithm>

#define max(a,b) (a>b?a:b)

#define abs(a) ((a)>0?(a):-(a))

#define min(a,b) (a<b?a:b)

using namespace std;

const int N=50005;

int n;

struct

{

    int w,h;

}stack[N];

int sp;

int main()

{

    while(scanf("%d",&n)&&n!=-1)

    {

        int ans=0;

        int a,b;

        for(int i=1;i<=n;i++)

        {

            scanf("%d%d",&a,&b);

            if(b>=stack[sp].h)

            {

                stack[++sp].w=a;

                stack[sp].h=b;

            }

            else

            {

                int sumw=0;

                while(stack[sp].h>=b)

                {

                    sumw+=stack[sp].w;

                    ans=max(ans,sumw*stack[sp].h);

                    sp--;

                }

                sumw+=a;

                stack[++sp].w=sumw;

                stack[sp].h=b;

            }

        }

        int sumw=0;

        while(sp>0)//最后栈里如果有元素则需要清空一遍

        {

            sumw+=stack[sp].w;

            ans=max(ans,sumw*stack[sp].h);

            sp--;

        }

        printf("%d\n",ans);

    }

    return 0;

}

 

你可能感兴趣的:(poj)