• 【POJ2559】Largest Rectangle in a Histogram


    一道单调栈的基础题,我们建立一个单调上升的栈,当一个矩形被扫描时,如果他的高度大于栈顶就直接入栈,否则就不断取出栈顶,直到栈空或者栈顶小于当前矩形,在出栈的同时,我们累计被弹出的矩形宽度之和,每次弹出一个矩形,我们就用他的高度乘累计的宽度更新答案,出栈结束后,我们把一个高度为当前高度,宽度为累计宽度的新矩形入栈。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 typedef long long ll;
     5 using namespace std;
     6 ll n,ans,a[100010],s[100010],p,w[100010];
     7 int main() {
     8     while(scanf("%lld",&n)&&n) {
     9         ans=0;
    10         memset(s,0,sizeof(s));
    11         memset(w,0,sizeof(w));
    12         memset(a,0,sizeof(a));
    13         for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
    14         for(int i=1;i<=n+1;i++) {
    15             if(a[i]>s[p]) {
    16                 s[++p]=a[i];
    17                 w[p]=1;
    18                 continue ;
    19             }
    20             ll wi=0;
    21             while(s[p]>a[i]) {
    22                 wi+=w[p];
    23                 ans=max(ans,wi*s[p]);
    24                 p--;
    25             }
    26             s[++p]=a[i];
    27             w[p]=wi+1;
    28         }        
    29         printf("%lld
    ",ans);
    30     } 
    31     return 0;
    32 }
    AC Code
  • 相关阅读:
    iOS加载动态图的两种方法
    python初探
    博客园封笔
    office的分栏技巧
    关于排序...
    LaTex 学习笔记
    vim 学习笔记
    iOS 编程学习笔记之Foundation框架
    数论
    扫描线概览
  • 原文地址:https://www.cnblogs.com/shl-blog/p/10631191.html
Copyright © 2020-2023  润新知