zoukankan      html  css  js  c++  java
  • hdu1506(单调栈)

    Largest Rectangle in a Histogram

    题意:

      给出n个连续的矩形,矩形的宽都为1,所有矩形放在同一水平线上(连续),问这些矩形组成的图形中可以找到的最大矩形面积是多少?

    分析:

      首先根据题意,这个矩形的高一定是这n个矩形中某一个的高,所以我们就枚举将这n个矩形的高当成我们最后找到的最大矩形的高,求出在这n个高下对应的最大面积,取最大值就好了。

      对于怎么找到在某个高下,矩形向左向右的边界,则利用单调栈实现。

    代码:

    #include <bits/stdc++.h>
    
    using namespace std;
    #define ll long long
    #define ull unsigned long long
    #define cls(x) memset(x,0,sizeof(x))
    #define clslow(x) memset(x,-1,sizeof(x))
    
    const int maxn=1e5+100;
    
    int n;
    
    stack<int>st;
    ll h[maxn],L[maxn],R[maxn];
    
    int main()
    {
    //    freopen("in.txt","r",stdin);
        while(scanf("%d",&n)!=EOF&&n)
        {
            for(int i=1;i<=n;i++){
                scanf("%lld",&h[i]);
            }
    
            while(!st.empty())  st.pop();
            for(int i=1;i<=n;i++){
                while(st.size()&&h[st.top()]>=h[i]) st.pop();
    
                if(st.empty())  L[i]=0;
                else            L[i]=st.top();
    
                st.push(i);
            }
            while(!st.empty())  st.pop();
            for(int i=n;i>=1;i--){
                while(st.size()&&h[st.top()]>=h[i]) st.pop();
    
                if(st.empty())  R[i]=n+1;
                else            R[i]=st.top();
    
                st.push(i);
            }
    
            ll ans=0;
            for(int i=1;i<=n;i++){
                ans=max(ans,h[i]*(R[i]-L[i]-1));
            }
            printf("%lld
    ",ans);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    向局域网共享文件夹 写文件(示例)
    安装adb之后出现 找不到设备的情况
    .net 下发送calendar
    解决api 跨域 webconfig添加节点
    String类为什么是不可变的
    Sql
    2020职业规划
    摘录
    Docker
    软件测试工程师的职责是什么
  • 原文地址:https://www.cnblogs.com/shutdown113/p/9377724.html
Copyright © 2011-2022 走看看