poj2559单调栈

题意:在多个矩形中,已知这些矩形的宽度都为1,长度不完全相等,求在这些矩形按题给顺序排列能包括的范围内能得到的面积最大的矩形


单调栈类型题目,所有元素各进栈和出栈各一次

先按照从小到大排序,一旦有不满足的就把前面的元素踢出去,并且计算之前一个的最大面积,然后组合成一个新的,但是这个新的的宽是把之前的累加在一起的

如果满足从小到大,就直接存在栈里面


最后都把这些元素提出来,计算相应的面积,并且选出最大的面积输出就好了

#include<stdio.h>
#include<stack>
using namespace std;

struct sets{
    __int64 high,wide;
}data;

int main()
{
    int n;
    while(scanf("%d",&n),n)
    {
        stack<sets>A;
        __int64 totalwide,tempans;
        scanf("%I64d",&data.high);
        data.wide=1;
        A.push(data);
        __int64 ans=data.high*data.wide;

        for(int i=1;i<n;i++){
            scanf("%I64d",&data.high);
            data.wide=1;
            if(data.high>=A.top().high){
                A.push(data);
            }
            else{
                totalwide=tempans=0;
                while(!A.empty()&&A.top().high>data.high){
                    totalwide+=A.top().wide;
                    tempans=totalwide*A.top().high;
                    if(tempans>ans)
                        ans=tempans;
                    A.pop();
                }
                totalwide+=data.wide;
                data.wide=totalwide;
                A.push(data);
            }
        }

        totalwide=tempans=0;
        while(!A.empty()){
            totalwide+=A.top().wide;
            tempans=totalwide*A.top().high;
            A.pop();
            if(tempans>ans)
                ans=tempans;
        }
        printf("%I64d\n",ans);
    }
    return 0;
}


你可能感兴趣的:(poj2559单调栈)