链接: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+;
ll a[M],l[M],r[M];
int main()
{
int n;
cin>>n;
for(int i = ;i <= n;i ++)
cin>>a[i];
stack<ll>s;
for(int i = ;i <= n;i ++){
while(s.size()&&a[s.top()]>=a[i]) s.pop();
if(s.empty()) l[i] = ;
else l[i] = s.top()+;
s.push(i);
}
while(!s.empty()) s.pop();
for(int i = n;i >= ;i --){
while(s.size()&&a[s.top()]>=a[i]) s.pop();
if(s.empty()) r[i] = n;
else r[i] = s.top()-;
s.push(i);
}
while(!s.empty()) s.pop();
ll ans = ;
for(int i = ;i <= n;i ++){
ll num = a[i]*(r[i]-l[i]+);
//cout<<i<<" "<<l[i]<<" "<<r[i]<<" "<<num<<endl;
ans = max(num,ans);
}
cout<<ans<<endl;
}

51nod 1102 面积最大的矩形 (单调栈)的更多相关文章

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

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1102 题意: 思路: 做法就是求出每个长方形向左向右所能延伸的最大距离. ...

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

    题面1:  题面2:  两道题除了数据范围不同,没有任何差异,两道题都可以o(n)(单调栈),o(nlog(n))(我自己的做法)解决. 解题思路1:(单调栈) 对于每个点找到右边第一个比它小的位 ...

  3. 51nod 1102 面积最大的矩形

    题目地址在这儿 求取:以某矩形g[i]为最小值的区间的左右端点,得到一个临时解.所有临时解中的最大值即为解. 求取区间的方法可以用单调栈,也可以用下面这种十分简洁的类似于递归的方法.下面这种解法求出来 ...

  4. [51nod1102]面积最大的矩形(单调栈||预处理)

    题意:求序列上某区间最小值乘区间长度的最大值. 解题关键:很早就在<挑战程序设计竞赛>中见过了,单调栈模板题,注意弹栈时如何处理后面的元素. 法一:单调栈 #include<bits ...

  5. hdu1506 直方图中最大的矩形 单调栈入门

    hdu1506 直方图中最大的矩形 单调栈入门 直方图是由在公共基线对齐的矩形序列组成的多边形.矩形具有相同的宽度,但可能具有不同的高度.例如,左侧的数字显示了由高度为2,1,4,5,1,3,3的矩形 ...

  6. [多校联考2019(Round 4 T2)][51nod 1288]汽油补给(ST表+单调栈)

    [51nod 1288]汽油补给(ST表+单调栈) 题面 有(N+1)个城市,0是起点N是终点,开车从0 -> 1 - > 2...... -> N,车每走1个单位距离消耗1个单位的 ...

  7. Leetcode84. 柱状图中最大的矩形(单调栈)

    84. 柱状图中最大的矩形 前置 单调栈 做法 连续区间组成的矩形,是看最短的那一块,求出每一块左边第一个小于其高度的位置,右边也同理,此块作为最短限制.需要两次单调栈 单调栈维护递增区间,每次不满足 ...

  8. 51nod 1254 最大子段和 V2 ——单调栈

    N个整数组成的序列a[1],a[2],a[3],…,a[n],你可以对数组中的一对元素进行交换,并且交换后求a[1]至a[n]的最大子段和,所能得到的结果是所有交换中最大的.当所给的整数均为负数时和为 ...

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

    #include<iostream> #include<cstring> #include<cstdio> using namespace std; ][6],m, ...

随机推荐

  1. day50

    JS基础 一.JS语言介绍 1.概念 浏览器脚本语言 可以编写运行在浏览器上的代码程序 属于解释性.弱语言类型编程语言 2.组成 ES语法:ECMAScript.主要版本ES5和ES6 DOM:文档对 ...

  2. 算法篇(前序)——Java的集合

    菜鸟拙见,望请纠正:附上JDK参考文档(中文文档和英文文档):链接:https://pan.baidu.com/s/14KDmCtQxeGCViq7e0zENjA 密码:e9xs  以及算法篇全文链接 ...

  3. MSP430F5438A的串口

    设置串口,最关键的是波特率的设置,推荐一个网站,很方便地计算波特率,http://software-dl.ti.com/msp430/msp430_public_sw/mcu/msp430/MSP43 ...

  4. Android Studio com.android.support:percent 导入错误 - 转

    看第一行代码(第二版的)书,讲了一个关于PercentFrameLayout和PercentRelativeLayout的部分,书上在build.gradle中导入了com.android.suppo ...

  5. 2017-2018-2 20155204《网络对抗技术》EXP5 MSF基础应用

    一.基础问题回答 用自己的话解释什么是exploit,payload,encode exploit:利用靶机系统中的一些漏洞进行攻击的过程,除去前期准备的工作,这一步是实施攻击. payload:载荷 ...

  6. 2017-2018 Exp1 PC平台逆向破解 20155214

    目录 Exp1 PC平台逆向破解 实验内容 知识点 官方源 中科大源 上海交大的源 新加坡源 debain源 debian安全更新源 163源的地址 阿里云kali源 启发 评论 Exp1 PC平台逆 ...

  7. 20155218《网络对抗》Exp3 免杀原理与实践

    20155218<网络对抗>Exp3 免杀原理与实践 一.使用msf生成后门程序的检测 (1)将上周msf生成的后门文件放在virscan.org中进行扫描,截图如下: (2)使用msf时 ...

  8. Exp02

    使用netcat后门工具 原理示意图 使用netcat获取主机操作Shell,cron启动 Win获取Linux Shell Linux获取Win Shell cron启动 用man -k指令查看有关 ...

  9. 20155330 《网络攻防》Exp1 PC平台逆向破解(5)M

    20155330 <网络攻防>Exp1 PC平台逆向破解(5)M 实践目标 运行pwn1可执行文件中的getshell函数,学习如何注入运行任何Shellcode 本次实践的对象是一个名为 ...

  10. LeetCode Container With Most Water (Two Pointers)

    题意 Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai ...