51nod 1102单调栈
来源:互联网 发布:mac用什么软件清理垃圾 编辑:程序博客网 时间:2024/06/15 03:44
1102 面积最大的矩形![](https://file.51nod.com/images/icon/ok.png)
![](https://file.51nod.com/images/icon/ok.png)
基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题
![](https://file.51nod.com/images/icon/star.png)
![](https://file.51nod.com/images/icon/plus.png)
有一个正整数的数组,化为直方图,求此直方图包含的最大矩形面积。例如 2,1,5,6,2,3,对应的直方图如下:
![](https://img.51nod.com/upfile/000fbce2/08d164337bdb2808000000000027de17.png)
面积最大的矩形为5,6组成的宽度为2的矩形,面积为10。
Input
第1行:1个数N,表示数组的长度(0 <= N <= 50000)第2 - N + 1行:数组元素A[i]。(1 <= A[i] <= 10^9)
Output
输出最大的矩形面积
Input示例
6215623
Output示例
10
很明确的做法是对于每一个矩形,向左右延伸至无法延伸然后计算更新最大值,朴素作法确实费时;我们维护一个高度递增的单调栈,如果当前a[i]比栈顶元素的高/相等就一直push,直到遇见高度小于栈顶元素高度时候,说明前面部分矩形的右端点最大只能到这了,因为高度不够了,接着我们就不断的提出栈顶元素,将他作为左端点,第一个出栈顶元素作为右端点更新最大值,直到栈空了或者栈顶元素不再>=a[i],退出pop操作。然后将ai加入栈顶,注意宽度是1+所有出栈元素宽度和,因为前面小于这些元素高度的矩形还是能穿过他们的。
struct node{ int h,w;};int n,a;stack<node>s;int main(){ ios::sync_with_stdio(false); cin>>n; ll ans=0; for(int i=0;i<n;i++) { cin>>a; if(s.empty() || s.top().h<=a) s.push(node{a,1}); else { int w=0; while(!s.empty() && s.top().h>a) { w+=s.top().w; ans=max(ans,(ll)s.top().h*w); s.pop(); } s.push(node{a,w+1}); } } int w=0; while(!s.empty()) { w+=s.top().w; ans=max(ans,(ll)s.top().h*w); s.pop(); } cout<<ans<<endl; return 0;}
阅读全文
0 0
- 51nod 1102 单调栈
- 51nod 1102 【单调栈】
- 51Nod - 1102 单调栈
- 51nod 1102单调栈
- 51nod 1102 面积最大的矩形【单调栈、预处理】
- 51nod 1102 面积最大的矩形(单调栈)
- 51nod 1272 最大距离 (单调栈)
- 51nod-1437 迈克步(单调栈)
- 51Nod 1349 最大值(单调栈+离线)
- 单调栈 51nod 1962 区间计数
- 51nod 1289大鱼吃小鱼 模拟 单调栈
- 51 NOD 1279 扔盘子 单调栈
- 51nod 5172(单调栈/思维)
- 51NOD 1952 栈 【单调队列】
- 51nod 1482 部落信号[单调栈]
- 51nod 1349 最大值【单调栈】
- 【单调栈】51Nod 1349 最大值
- 51nod 1437 迈克步【单调栈】
- linux系统文件夹+linux服务器注意事项+linux常用命令
- java创建线程的三种方式及其对比
- Maximum Flow
- numpy核心数据结构-矩阵
- android代码混淆
- 51nod 1102单调栈
- 线程池的理解及使用
- python2和python3同时存在时 pip install xxx 安装出错
- JavaWeb中url和web-xml中<url-pattern>的联系
- CSS之水平垂直居中
- 深度学习的常用框架
- pandas使用详解
- 用Python爬取更加有价值的文章
- 选择器DLPickerView