基础知识:


这篇博客讲得很清楚了,不再赘述https://blog.csdn.net/wubaizhe/article/details/70136174#commentBox

单调栈主要用于找往左遍历第一个小于它的数的位置或者往右遍历第一个小于它的位置(思想懂了之后,一些简单的变形也就理解了)。

模版代码:

Stack<int> S;for(int i=1 ;i<=n ;i++){while(S.size() && a[S.top()] >= a[i]) S.pop();if(S.empty())     L[i] = 0;else              L[i] = S.top();S.push(i);}

hdu1506和小A的柱形图两道题目基本上是一样的,但是后者比前者多了一个条件,比前者复杂一小丢丢,要用到前缀和数组,所以这里只讲解后一道题。

解题思路


对于当前位置的高度h[i],向左寻找第一个小于h[i]的高度h[j],取h[j]的右一个位置,对应高度h[k](这样就有h[k]≥h[i]

对于当前位置的高度h[i],向右寻找第一个小于h[i]的高度h[jj](无需把数组倒置,只需要反向遍历i就行,其他操作和上面相同),取h[jj]的左一个位置,对应高度h[kk](这样就有h[kk]≥h[i])

这样我们就可以得到h[k]≥h[i],h[kk]≥h[i],且k≤i≤kk,那么我们就可以直接用k到kk之间的宽度(前缀和公式)乘以h[i]就是以h[i]为基准能得到的最大的面积了,遍历i求出最大的面积就是答案。

-----------------------update

2020.1.29

学习了这种问题的新的写法,在取出栈顶元素的同时,将取走的栈顶的矩形的宽度加到栈内剩余元素的所占宽度中,产生累积效应。具体实现见代码。

ac代码


#include <iostream>
#include <algorithm>
#include <stack>
typedef long long ll;
#define maxn 1000005
using namespace std;
struct{ll w,h;
}a[maxn];
ll l[maxn],r[maxn],sumw[maxn]={0};
int main()
{//freopen("/Users/zhangkanqi/Desktop/11.txt","r",stdin);ll n;scanf("%lld",&n);for(ll i=1;i<=n;i++){scanf("%lld",&a[i].w);sumw[i]=sumw[i-1]+a[i].w;}for(ll i=1;i<=n;i++)scanf("%lld",&a[i].h);stack<ll> s;for(ll i=1;i<=n;i++){while(!s.empty() && a[s.top()].h>=a[i].h)s.pop();if(s.empty()) l[i]=1;else l[i]=s.top()+1;//左侧第一个小于a[i].h的点的右边一个s.push(i);}while(!s.empty()) s.pop();for(ll i=n;i>=1;i--){while(!s.empty() && a[s.top()].h>=a[i].h)s.pop();if(s.empty()) r[i]=n;else r[i]=s.top()-1;//右侧第一个小于a[i].h的点的左边一个s.push(i);}ll ans=0;for(ll i=1;i<=n;i++){cout<<(sumw[r[i]]-sumw[l[i]-1])*a[i].h<<endl;ans=max(ans,(sumw[r[i]]-sumw[l[i]-1])*a[i].h);}printf("%lld\n",ans);return 0;
}

----------update版代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5+10;
ll h[maxn], a[maxn], s[maxn], w[maxn];
int n;
int main()
{//freopen("/Users/zhangkanqi/Desktop/11.txt","r",stdin);scanf("%d", &n);for(int i = 1; i <= n; i++) scanf("%lld", &a[i]);for(int i = 1; i <= n; i++) scanf("%lld", &h[i]);ll ans = 0;int p = 0;h[n+1] = 0;for(int i = 1; i <= n+1; i++){if(h[i]>s[p]) s[++p] = h[i], w[p]=a[i];else{int wid = 0;while(s[p]>h[i]){wid += w[p];ans = max(ans, wid*s[p--]);}s[++p] = h[i];w[p] = wid+a[i];}}printf("%lld\n", ans);return 0;
}

【hdu1506/牛客小A的柱形图】单调栈入门题目相关推荐

  1. 牛客 奇怪的排序问题(单调栈/遍历)

    文章目录 1. 题目 2. 解题 1. 题目 链接:https://ac.nowcoder.com/acm/contest/10166/B 来源:牛客网 操场上有n个人排成一队,这n个人身高互不相同, ...

  2. 2021牛客多校2 - Stack(单调栈+拓扑)

    题目链接:点击查看 题目大意:给出 b[i]b[i]b[i] 数组的求解过程: Stk is an empty stack for i = 1 to n :while ( Stk is not emp ...

  3. 牛客 - 牛牛的滑动窗口(单调栈+思维+差分)

    题目链接:点击查看 题目分析:给出 nnn 个数,定义滑动窗口的贡献是其中最大值与最小值的乘积,现在问对于长度分别为 [1,n][1,n][1,n] 的滑动窗口,贡献之和分别是多少 题目分析:考虑暴力 ...

  4. 牛客小白月赛13-H(单调栈+树状数组)

    题目链接:https://ac.nowcoder.com/acm/contest/549/H 题意:给一个柱状图,包括每个矩阵的宽度和高度,求能组成的最大矩阵的面积. 思路:显然最大矩阵的高一定为n个 ...

  5. 牛客 小米校招 计算题 单调栈 接雨水

    给定n个非负整数表示每个宽度为1的柱子的高度题,计算按此排列的柱子,下雨之后能接多少雨水. 经典的题目 leetcode 42 接雨水 单调栈 保持栈内单调递减 每次把一个矮的出栈都能够加上一大块面积 ...

  6. 牛客小d和孤独的区间

    牛客小d和孤独的区间 这道题我们如果等到数据都输入完后再计算会浪费很多时间 所以还是每次输入都计算一遍 我们知道要找到一个区间里只有一个1,其余都是0 所以这时候我们可以将输入分为两种情况 1,输入为 ...

  7. 牛客-小a与星际探索

    这是一道伪图论题 链接:https://ac.nowcoder.com/acm/problem/22144 来源:牛客网 题目描述 小a正在玩一款星际探索游戏,小a需要驾驶着飞船从11号星球出发前往n ...

  8. 牛客——小a与星际探索

    链接:https://ac.nowcoder.com/acm/contest/317/C 来源:牛客网 题目描述 小a正在玩一款星际探索游戏,小a需要驾驶着飞船从11号星球出发前往nn号星球.其中每个 ...

  9. 牛客—— 小A的最短路 (LCA)

    [牛客] 小A的最短路 (LCA) 原题链接 题意: 给定一棵树,除给定的特殊边边权为0外,其余边权均为1.求两点之间的最短距离.n为3e5 思路: 今天碰到的第一道喜欢的题hhhhhh 题目是一棵树 ...

  10. oj记录 牛客小I白月赛50 C减法与求余 (思维

    题目描述 链接:https://ac.nowcoder.com/acm/contest/11227/C 来源:牛客网 鸡尾酒的学生丹丹分不清求余和减法,因为他觉得两种运算都是将一个数字变小,所以都差不 ...

最新文章

  1. java 对excel操作 读取、写入、修改数据;导出数据库数据到excel
  2. C语言再学习 -- 循环语句
  3. JDK中没有jre文件夹和tools.jar文件
  4. CurvLearn开源 | 阿里妈妈曲率学习框架详解
  5. 实例说明代码段(.text)、数据段(.data)、bss段、只读数据段(.rodata)、堆栈的划分依据
  6. oracle 截取 tr,oracle中实现截取字符串(substr)、查找字符串位置(instr)、替换字符串(replace)...
  7. eclipse install software时始终停留在calculating requirements and depen
  8. 论文笔记:TABERT: Pretraining for Joint Understanding of Textual and Tabular Data
  9. JavaScript - 获取、修改 title 元素的内容
  10. 计组实验-CPU设计-指令添加
  11. 华三模拟器HCL文件打开/导入失败解决方法
  12. oracle 临时表空间语句,oracle的临时表空间
  13. 交规考试通过,庆祝一下
  14. input文件框选择本地图片后页面预览图片并获取图片长宽以及大小 图片上传前预览
  15. Kanade-Lucas-Tomasi Feature Tracker 代码分析
  16. 31省份推出40万亿投资蓝图 新基建、公共卫生成亮点
  17. IDM和迅雷哪个更好用?Internet Download Manager迅雷对比
  18. Vs2017 开发 调用 WCF
  19. [计算模型]%90的银弹
  20. 金融财务工作汇报PPT模板

热门文章

  1. 需要重新启动php,win10电脑遇到问题要重新启动怎么回事
  2. Samba和用户组综合练习
  3. ARM开发7.3.1 基础实训( 1 ) 单个按键的输入系统设计( 1 )--LPC21XX
  4. c语言学生管理p1指向编译错误,在ubuntu下用C语言编写一个学生管理系统,编译时出错,紧急求救!!!...
  5. Shell脚本里的双冒号是什么意思
  6. Codeforces 679A Bear and Prime 100
  7. mount 开机自动挂载
  8. 网络安全系列之四十九 IIS6.0权限设置
  9. 学习Maven命令中
  10. jQuery 2.0.3 源码分析Sizzle引擎 - 编译函数(大篇幅)