• 9715 相邻最大矩形面积 单调栈


    9715 相邻最大矩形面积

    时间限制:1000MS  内存限制:65535K
    提交次数:0 通过次数:0

    题型: 编程题   语言: G++;GCC;VC;JAVA

     

    Description

    在X轴上水平放置着 N 个条形图,这 N 个条形图就组成了一个柱状图,每个条形图都是一个矩形,每个
    矩形都有相同的宽度,均为1单位长度,但是它们的高度并不相同。
    例如下图,图1包含的矩形的高分别为2,1,4,5,1,3,3 单位长度,矩形的宽为1单位长度。
    你的任务就是计算柱状图中以X轴为底边的最大矩形的面积。图2阴影部分就是上述例子的最大矩形面积。
    




    输入格式

    输入数据的第一行是一个整数 N(1≤ N ≤100000),表示柱状图包含 N 个矩形。
    紧接着 N 个整数h1,...,hn(0≤ hi ≤20000, 1≤ i≤ N),表示柱状图中按从左到右顺序给出的矩形
    的高度。矩形的宽度为1。   
    



    输出格式

    输出一个整数S,表示以X轴为底边的最大矩形的面积。



     

    输入样例

    7
    2 1 4 5 1 3 3



     

    输出样例

    8



     

    提示

    这个问题,用简单的方法分析,寻找相邻几个矩形竖条最矮个构成的大矩形。O(n^2)的算法是比较容易实现的。
    



    用单调栈维护,dp[i][0]表示向左,第一个小于a[i]的数,dp[i][1]表示向右,第一个小于a[i]的数。

    那么区间内的就是以a[i]为高的ans。

    然后枚举每一个a[i]统计答案即可。

    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #define IOS ios::sync_with_stdio(false)
    using namespace std;
    #define inf (0x3f3f3f3f)
    typedef long long int LL;
    
    #include <iostream>
    #include <sstream>
    #include <vector>
    #include <set>
    #include <map>
    #include <queue>
    #include <string>
    const int maxn = 100000 + 20;
    int dp[maxn][2];
    int a[maxn];
    int stack[maxn];
    int id[maxn];
    int n;
    void work() {
        for (int i = 1; i <= n; ++i) {
            scanf("%d", &a[i]);
        }
        a[n + 1] = -1;
        int top = 1;
        stack[top] = a[1];
        id[top] = 1;
        for (int i = 2; i <= n + 1; ++i) {
            while (top >= 1 && a[i] < stack[top]) {
                dp[id[top]][1] = i;
                top--;
            }
            ++top;
            stack[top] = a[i];
            id[top] = i;
        }
        top = 1;
        stack[top] = a[n];
        id[top] = n;
        for (int i = n - 1; i >= 0; --i) {
            while (top >= 1 && a[i] < stack[top]) {
                dp[id[top]][0] = i;
                --top;
            }
            ++top;
            stack[top] = a[i];
            id[top] = i;
        }
    //    for (int i = 1; i <= n; ++i) {
    //        printf("%d***
    ", dp[i][0]);
    //    }
        int ans = 0;
        for (int i = 1; i <= n; ++i) {
            int t = dp[i][1] - i + i - dp[i][0] - 1;
            ans = max(ans, t * a[i]);
        }
        printf("%d
    ", ans);
    }
    
    int main() {
    #ifdef local
        freopen("data.txt","r",stdin);
    #endif
        while (scanf("%d", &n) != EOF) work();
        return 0;
    }
    View Code
  • 相关阅读:
    16.14
    16.13
    JAVA JLabel自定义子类无法显示
    16.12
    16.11
    css实现垂直居中
    HTML5学习笔记
    HTML、Css中插入图片的一些问题
    MySQL的if函数
    java实现将汉字转为首字母、拼音
  • 原文地址:https://www.cnblogs.com/liuweimingcprogram/p/6061430.html
Copyright © 2020-2023  润新知