51nod 1102 单调栈
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1102

第1行:1个数N,表示数组的长度(0 <= N <= 50000)
第2 - N + 1行:数组元素A[i]。(1 <= A[i] <= 10^9)
输出最大的矩形面积
6
2
1
5
6
2
3
10
以前用迭代处理然后dp的作法,复杂度是O(NlogN),现在才知道可以用单调栈达到O(N)的线性作法,很巧妙。
很明确的做法是对于每一个矩形,向左右延伸至无法延伸然后计算更新最大值,朴素作法确实费时;
我们维护一个高度递增的单调栈,如果当前a[i]比栈顶元素的高/相等就一直push,直到遇见高度小于栈顶元素高度时候,说明前面部分矩形的右端点最大只能到这了,因为高度不够了,
接着我们就不断的提出栈顶元素,将他作为左端点,第一个出栈顶元素作为右端点更新最大值,直到栈空了或者栈顶元素不再>=a[i],退出pop操作。
然后将ai加入栈顶,注意宽度是1+所有出栈元素宽度和,因为前面小于这些元素高度的矩形还是能穿过他们的。
#include <iostream>
#include<algorithm>
#include<stack>
#include<cstdio>
using namespace std;
typedef long long LL;
struct node{ int h, w; };
int main()
{
int N, i, j, k, a;
stack<node>S;
scanf("%d", &N);
LL ans = ;
for (i = ;i <= N;++i)
{
scanf("%d", &a);
if (S.empty() || S.top().h <= a) S.push(node{a,});
else {
int w = ;
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+});
}
}
int w = ;
while (!S.empty()) {
w += S.top().w;
ans = max(ans,(LL)S.top().h*w);
S.pop();
}
printf("%lld\n", ans);
return ;
}
51nod 1102 单调栈的更多相关文章
- 51nod 1215 单调栈/迭代
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1215 1215 数组的宽度 题目来源: Javaman 基准时间限制:1 ...
- 51nod 1279 单调栈
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1279 1279 扔盘子 题目来源: Codility 基准时间限制:1 ...
- 51nod 1102 面积最大的矩形 (单调栈)
链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1102 思路: 首先介绍下单调栈的功能:利用单调栈,可以找到从左/ ...
- 51nod 1102 面积最大的矩形(单调栈)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1102 题意: 思路: 做法就是求出每个长方形向左向右所能延伸的最大距离. ...
- 51nod 1102 【单调栈】
思路: 对于这个高度往左能延伸最远x,往右能延伸最远y,(x+1+y)*w; 利用单调栈就行了: #include <cstdio> #include <stack> #inc ...
- 51nod 1102 面积最大的矩形 && 新疆大学OJ 1387: B.HUAWEI's billboard 【单调栈】+【拼凑段】(o(n) 或 o(nlog(n))
题面1:  题面2:  两道题除了数据范围不同,没有任何差异,两道题都可以o(n)(单调栈),o(nlog(n))(我自己的做法)解决. 解题思路1:(单调栈) 对于每个点找到右边第一个比它小的位 ...
- 51nod 1158 全是1的最大子矩阵(单调栈 ,o(n*m))
前置问题:51nod 1102 面积最大的矩形 附上链接: 51nod 1102 面积最大的矩形 这题的题解博客 需要了解的知识:单调栈,在前置问题中已经讲解. 解题思路 对每行求左边连续1的个数,得 ...
- 51nod 1437 迈克步(单调栈)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1437 题意: 思路: 单调栈题.求出以每个数为区间最大值的区间范围即可. ...
- 51Nod 1158 全是1的最大子矩阵 —— 预处理 + 暴力枚举 or 单调栈
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1158 1158 全是1的最大子矩阵 基准时间限制:1 秒 空 ...
随机推荐
- python并发之IO模型(一)
事件驱动模型 协程:遇到IO操作就切换. 但什么时候切回去呢?怎么确定IO操作完了? 很多程序员可能会考虑使用“线程池”或“连接池”.“线程池”旨在减少创建和销毁线程的频率,其维持一定合理数量的线程, ...
- urlencode编码,解码
对字符串传入的字典参数进行urlencode编码,就需要用到两个方法urlencode和quoteurlencode方法传字典参数 from urllib.parse import urlencode ...
- Linux基础系列:常用命令(4)_系统监控
1. 系统监视和进程控制工具—top和free 1) top命令的功能:top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器. 2) ...
- Web安全相关资料
Asp.net安全架构: http://www.cnblogs.com/luminji/category/381486.html
- 吐槽 坑爹的MySQL安装路径选择
一般再windows下面安装MySQL我们都会选择msi安装模式,然而安装最新版的MySQL(mysql-installer-community-5.7.11.0.msi 下载地址)发现MySQL默认 ...
- 【TopCoder】SRM159 DIV2总结
250分题:给出一些规则,问街道上哪些地方可以停车. 简单的模拟题,考察每条规则是否成立即可. 代码:StreetParking 500分题:实现集合的交,并和差运算. 交运算:一个数组放到集合中,遍 ...
- pppoe白皮书
转:https://blog.csdn.net/achejq/article/details/19478811 PPPoE技术白皮书 关键词:PPP,Ethernet,PPPoE 摘 要:PPP ...
- 20165101刘天野 2017-2018-2 《Java程序设计》第6周学习总结
#20165101刘天野 2017-2018-2 <Java程序设计>第6周学习总结 教材学习内容总结 第八章:常用实用类 String类:不可变类,一些看起来能够改变String的方法其 ...
- USB引脚及定义
USB 2.0 USB接口定义: USB引脚定义: 针脚 名称 说明 接线颜色 1 VCC +5V电压 红色 2 D- 数据线负极 白色 3 D+ 数据线正极 绿色 4 GND 接地 黑色 Min ...
- leetcode刷题3.无重复字符的最长子串
题目:给定一个字符串,找出不含有重复字符的 最长子串 的长度. 示例: 给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3. ...