51nod 1102 面积最大的矩形 (单调栈)

Posted Dysania_l

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51nod 1102 面积最大的矩形 (单调栈)相关的知识,希望对你有一定的参考价值。

链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1102

思路:

首先介绍下单调栈的功能:利用单调栈,可以找到从左/右遍历第一个比它小/大的元素的位置。时间复杂度为O(n)。

这道题要找最大的矩形的面积,我们可以假设i为矩形最低的高,那么对每一个i找到向左走第一个比他小的l[i],和向右走第一个比他小的r[i]。

我们可以知道当前矩阵最大为:a[i] * (l[i]-1-(r[i]-1)+1);对所有i的值取最大的。

 

实现代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const int M = 1e5+10;
ll a[M],l[M],r[M];
int main()
{
    int n;
    cin>>n;
    for(int i = 1;i <= n;i ++)
        cin>>a[i];
    stack<ll>s;
    for(int i = 1;i <= n;i ++){
        while(s.size()&&a[s.top()]>=a[i]) s.pop();
        if(s.empty()) l[i] = 1;
        else l[i] = s.top()+1;
        s.push(i);
    }
    while(!s.empty()) s.pop();
    for(int i = n;i >= 1;i --){
        while(s.size()&&a[s.top()]>=a[i]) s.pop();
        if(s.empty()) r[i] = n;
        else r[i] = s.top()-1;
        s.push(i);
    }
    while(!s.empty()) s.pop();
    ll ans = 0;
    for(int i = 1;i <= n;i ++){
        ll num = a[i]*(r[i]-l[i]+1);
       //cout<<i<<" "<<l[i]<<" "<<r[i]<<" "<<num<<endl;
        ans = max(num,ans);
    }
    cout<<ans<<endl;
}

 

以上是关于51nod 1102 面积最大的矩形 (单调栈)的主要内容,如果未能解决你的问题,请参考以下文章

51nod 1158 全是1的最大子矩阵(单调栈 ,o(n*m))

51nod 1102 面积最大的矩形 && 新疆大学OJ 1387: B.HUAWEI's billboard 单调栈+拼凑段(o(n) 或 o(nlog(n))

51Nod - 1102 面积最大的矩形

51nod_1102_面积最大的矩形

HDU -1506 Largest Rectangle in a Histogram&&51nod 1158 全是1的最大子矩阵 (单调栈)

51nod1158 最大子矩形 单调栈应用