• POJ 2559


    题目链接:http://poj.org/problem?id=2559

    题意:

    给出 $n(1 le n le 10^5)$ 个宽为 $1$,高为 $h_i(0 le h_i le 10^9)$ 的矩形,它们从原点开始并排在 $x$ 轴上,

    现在要求出,这个合并产生的图形内部最大的矩形的面积。

    Sample Input

    7 2 1 4 5 1 3 3

    4 1000 1000 1000 1000

    0

    Sample Output

    8

    4000

    题解:

    如果矩形的高度从左到右是单增的,那么答案必然是尝试每个矩形的高度作为答案矩形的高度,而宽度则一直延伸到右边界。

    如果出现了某个矩形,其高度比上一个矩形小,那么可想而知,此前那些矩形往右延伸遇到了当前这个矩形,高度必然要被压低,

    换句说,再往后,答案矩形的高度就受制于当前矩形而非前面那些矩形了。因此,可以将前面所有高过我的矩形统统变成跟我一样高的。

    这样一来,栈内维护的矩形高度永远是单增的。

    AC代码:

    #include<iostream>
    #include<cstdio>
    #include<stack>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    typedef pair<int,int> pii;
    const int maxn=100000+10;
    
    int n,h[maxn];
    stack<pii> S;
    int main()
    {
        while(scanf("%d",&n) && n)
        {
            for(int i=1;i<=n;i++) scanf("%d",&h[i]);
            ll ans=0;
            for(int i=1;i<=n;i++)
            {
                if(S.empty() || h[i]>=S.top().first) {
                    S.push(make_pair(h[i],1));
                } else {
                    int w=0;
                    while(S.size() && h[i]<S.top().first)
                    {
                        w+=S.top().second;
                        ans=max(ans,(ll)w*S.top().first);
                        S.pop();
                    }
                    S.push(make_pair(h[i],w+1));
                }
            }
            int w=0;
            while(!S.empty())
            {
                w+=S.top().second;
                ans=max(ans,(ll)w*S.top().first);
                S.pop();
            }
            printf("%I64d
    ",ans);
        }
    }
  • 相关阅读:
    困难4. 寻找两个正序数组的中位数
    6. Z 字形变换
    学习mysql176. 第二高的薪水
    竞赛6194. 最小 XOR
    中等856. 括号的分数
    竞赛6193. 沙漏的最大总和
    竞赛2430. 对字母串可执行的最大删除数
    困难927. 三等分
    困难1235. 规划兼职工作
    学习下mysql175. 组合两个表
  • 原文地址:https://www.cnblogs.com/dilthey/p/9905428.html
Copyright © 2020-2023  润新知