zoukankan      html  css  js  c++  java
  • hdu 1506:Largest Rectangle in a Histogram 【单调栈】

    题目链接

    对栈的一种灵活运用吧算是,希望我的注释写的足够清晰。。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long LL;
     4 
     5 const int N=100010;
     6 int Stack[N];    //Stack[]为单调栈(即每次能入栈的元素值必比栈顶元素(若存在)要大) 
     7 int len[N];        //len[]与Stack[]同步 ,记录的是从Stack[]中对应元素起向左最大可延伸的宽度 
     8 int n;
     9 LL top,ans,h;
    10 
    11 void print()
    12 {
    13     printf("top=%d,    ans=%d
    ",top,ans);
    14     printf("	Stack:");
    15     for(int i=0;i<=top;i++)
    16         printf("%6d",Stack[i]);
    17     puts("");
    18     printf("	  len:");
    19     for(int i=0;i<=top;i++)
    20         printf("%6d",len[i]);
    21     puts("");
    22 }
    23 
    24 int main()
    25 {
    26     while(scanf("%d",&n)&&n)
    27     {
    28         memset(Stack,0,sizeof(Stack));
    29         memset(len,0,sizeof(len)); 
    30         top=-1,ans=0;
    31         for(int i=0; i<=n; i++)
    32         {
    33             if(i<n) scanf("%lld",&h);
    34             else h=-1;    //用作结束标记 
    35             if(top<0||Stack[top]<h)
    36             {
    37                 Stack[++top]=h;    //    h入栈
    38                 len[top]=1;        //    显然新入栈元素比原栈顶元素大,此时向左最大延伸“1”宽度 
    39             }                    //  “1”可根据具体题目进行修改~ 
    40             else    // if(top>=0&&Stack[top]>=h
    41             {
    42                 int l=0;
    43                 while(Stack[top]>=h&&top>=0)
    44                 {
    45                     ans=max(ans,(LL)(len[top]+l)*Stack[top]);    //更新ans 
    46                     l+=len[top--];    //Stack[]和len[]同时将栈顶元素弹出 
    47                 }    //循环结束后, top<0||Stack[top]<h 
    48                 if(h>0)
    49                 {
    50                     Stack[++top]=h;    //    h入栈 
    51                     len[top]=l+1;    //    以top为起点的最长连续(h>=Stack[top])的区间长度 
    52                 }
    53             }
    54 //            print();
    55         }
    56         printf("%lld
    ",ans);
    57     }
    58 }
  • 相关阅读:
    数据仓库深入了解
    修改hive 默认fs为s3 遇到的坑
    Hadoop集群的各部分常用端口
    mvc结合web应用实例分析
    MVC简介
    关于jQuery获得表单radio类型输入框的选中值
    关于js中的取值问题
    struct2的xml文件中result的配置(转)
    关于http响应状态码
    关于hibernate插入数据到mysql数据库中文乱码问题的解决
  • 原文地址:https://www.cnblogs.com/Just--Do--It/p/6505889.html
Copyright © 2011-2022 走看看