zoukankan      html  css  js  c++  java
  • #单调栈 ——Acwing131. 直方图中最大的矩形

    131. 直方图中最大的矩形

    直方图是由在公共基线处对齐的一系列矩形组成的多边形。

    矩形具有相等的宽度,但可以具有不同的高度。

    通常,直方图用于表示离散分布,例如,文本中字符的频率。

    现在,请你计算在公共基线处对齐的直方图中最大矩形的面积。

    图例右图显示了所描绘直方图的最大对齐矩形。

    输入格式
    输入包含几个测试用例。

    每个测试用例占据一行,用以描述一个直方图,并以整数n开始,表示组成直方图的矩形数目。

    然后跟随n个整数h1,…,hn。

    这些数字以从左到右的顺序表示直方图的各个矩形的高度。

    每个矩形的宽度为1。

    同行数字用空格隔开。

    当输入用例为n=0时,结束输入,且该用例不用考虑。

    输出格式
    对于每一个测试用例,输出一个整数,代表指定直方图中最大矩形的区域面积。

    每个数据占一行。

    请注意,此矩形必须在公共基线处对齐。

    数据范围
    1≤n≤100000,
    0≤hi≤1000000000
    输入样例:
    7 2 1 4 5 1 3 3
    4 1000 1000 1000 1000
    0
    输出样例:
    8
    4000

    #include<cstdio>
    #include<iostream>
    #include<stack>
    using namespace std;
    long long ans;
    int a[100010];
    struct node{
        int h,w;
    };
    int main(){
        int n;
        while(~scanf("%d",&n)&&n){
            node tmp;
            stack<node> s;
            ans=0;
            for(int i=1;i<=n;i++)
                scanf("%d",&a[i]);
            a[n+1]=0;
            for(int i=1;i<=n+1;i++){
                if(s.empty()||a[i]>s.top().h){
                    tmp.h=a[i];tmp.w=1;
                    s.push(tmp);
                }else{
                    int width=0;
                    while(!s.empty()&&a[i]<=s.top().h){
                        width+=s.top().w;
                        ans=max(ans,(long long)width*s.top().h);
                        s.pop();
                    }
                    tmp.h=a[i];tmp.w=width+1;
                    s.push(tmp);
                }
            }
            printf("%lld
    ",ans);
        }
        return 0;
    }
    
  • 相关阅读:
    计蒜客 动态规划基础 蒜头跳木桩
    委托的使用和合并
    asp.net "callback" 和 "postback" 的区别.
    3 顶层父类
    2 异常类
    1 智能指针
    16 #error 和 #line
    15 条件编译
    14 宏
    13 编译和链接
  • 原文地址:https://www.cnblogs.com/yuanyulin/p/14026800.html
Copyright © 2011-2022 走看看