zoukankan      html  css  js  c++  java
  • poj2599 单调栈维护最大连续矩形面积

      这个题就是给你一串连续的矩形, 每个矩形的宽度为1, 高度给定, 选定连续的一串矩形, 其高度是所有矩形高度中的最小值,宽度为选定的, 问怎么选能使矩形的面积最大?我们以一个矩形为中心,并设这个矩形的高度最小, 分别向两边延生, 那么此时的最大面积就是a[i] * (R[i]-l[i]+1), 代码如下:

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <iostream>
    
    using namespace std;
    typedef long long LL;
    int n;
    int a[100000+100];
    int st[100000+100], top;
    int L[100000+100], R[100000+100];
    
    int main(){
        while(scanf("%d", &n) == 1){
            if(n == 0) break;
            for(int i=0; i<n; i++) scanf("%d", &a[i]);
            top = 0;
            //计算最左边的
            for(int i=0; i<n; i++){
                while(top>0 && a[st[top-1]]>=a[i]) top--;
                L[i] = top==0?0:st[top-1]+1;
                st[top++] = i;
            }
            //计算最右边的
            top = 0;
            for(int i=n-1; i>=0; i--){
                while(top>0 && a[st[top-1]]>=a[i]) top--;
                R[i] = top==0?n-1:st[top-1]-1;
                st[top++] = i;
            }
    //        for(int i=0; i<n; i++)
    //            printf("%d%c", L[i], i==n-1?'
    ':' ');
    //        for(int i=0; i<n; i++)
    //            printf("%d%c", R[i], i==n-1?'
    ':' ');
            LL area = 0;
            for(int i=0; i<n; i++){
                area = max(area, (LL)a[i]*(R[i]-L[i]+1));
            }
            cout<<area<<endl;
        }
        return 0;
    }
  • 相关阅读:
    jQuery小案例
    update-alternatives
    计算机网络备忘
    报文交换 (转自百度百科,方便以后复习)
    erlang supervisor simple_one_for_one实例
    erlang supervisor中启动普通的进程
    erlang四大behaviour之一gen_server(转载)
    用Doxygen+Graphviz生成函数调用流程图(转)
    selenium模块
    request模块
  • 原文地址:https://www.cnblogs.com/xingxing1024/p/5284038.html
Copyright © 2011-2022 走看看