zoukankan      html  css  js  c++  java
  • Largest Rectangle in a Histogram

    题:

    如图所示,在一条水平线上有n个宽为1的矩形,求包含于这些矩形的最大子矩形面积(图中的阴影部分的面积即所求答案)。

    输入格式: 有多组测试数据,每组数据占一行。输入零时读入结束。

    每行开头为一个数字n(1<=n<=100000),接下来在同一行给出n个数字h1h2...hn(0<=hi<=1000000000)表示每个矩形的高度。

    输出格式: 对于每组数据,输出最大子矩阵面积,一组数据输出一行。


    思路:维护一个单调递增的栈 栈里存的是矩形的高和宽 维护子矩形的高单调递增

       若现在的矩形(宽度为一) 的高度大于栈顶矩形的高直接压栈

               否则就要把前面比它大的都弹出 同时计算出从这个矩形开始向左可以扩展的每个矩形的面积 更新答案

              觉得这道题很好qwq

    code

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define ll long long
    #define go(i,a,b) for(register int i=a;i<=b;i++)
    using namespace std;
    ll read()
    {
      ll x=0,y=1; char c; c=getchar();
      while(c<'0'||c>'9') {if(c=='-') y=-1;c=getchar();}
      while(c>='0'&&c<='9') {x=(x<<3)+(x<<1)+c-'0';c=getchar();}
      return x*y;
    }
    struct node
    {
      ll h,w;
    }rec[100010];
    ll ans,h,top,n;
    int main()
    {
      while(1)
        {
          n=read();if(!n) break ;
          n+=1;ans=0;top=0;
          go(k,1,n)
          {
            if(k!=n) h=read(); else h=0;
            if(h>=rec[top].h) rec[++top]=(node){h,1};
            else
              {
                ll w=0;
                while(h<rec[top].h)
                {
                  w+=rec[top].w;
                  ans=max(ans,(ll)w*rec[top].h);
                  top--;
                }
                rec[++top]=(node){h,w+1};
              }
          }
            printf("%lld
    ",ans);
      }
      return 0;
    }
    光伴随的阴影
  • 相关阅读:
    POJ2785-4 Values whose Sum is 0
    Codeforce 9C
    Codeforces 797C -Minimal string
    程序员自我修养
    异或
    Socket网络编程
    java编写本月日历
    PreparedStatement的用法
    项目导入时报错:The import javax.servlet.http.HttpServletRequest cannot be resolved 解决方法
    Dell灵越 5559笔记本安装固态硬盘 BIOS设置
  • 原文地址:https://www.cnblogs.com/forward777/p/10124854.html
Copyright © 2011-2022 走看看