题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1506

题目的意思其实就是要找到一个尽可能大的矩形来完全覆盖这个矩形下的所有柱子,只能覆盖柱子,不能留空。

我们求得的面积其实就是Max{s=(right[i] - left[i] + 1)*height[i];(i>=1&&i<=n)}

每一个柱子都要尽可能向左向右延伸,使得获得最大的面积。

此时我就要用到单调栈

单调栈就是栈内元素单调递增或者单调递减的栈,单调栈只能在栈顶操作。

http://blog.csdn.net/liujian20150808/article/details/50752861

这里我们还是做一个总结

单调栈的维护是 O(n) 级的时间复杂度,因为所有元素只会进入栈一次,并且出栈后再也不会进栈了。

单调栈的性质:

1.单调栈里的元素具有单调性

2.元素加入栈前,会在栈顶端把破坏栈单调性的元素都删除

3.使用单调栈可以找到元素向左遍历第一个比他小的元素,也可以找到元素向左遍历第一个比他大的元素。

基于此题,我们可以知道,先每一次从左到右放入柱子(保持递增单调栈),也就说一旦有一个柱子和栈顶元素一比发现比它大,那么这个柱子首先要记录它的left值为自己的本身的下标,如果发现这个柱子比栈顶的小,我们依次将栈顶元素出栈,直至又能组成递增的序列,此时这个柱子的left值就为现在栈顶的left值。

后面我们从右向左放入柱子(保持的依旧是递增的单调栈)。获得right值。

代码如下

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<stack>
#define LL long long
using namespace std;
const int MAXN = ;
struct node
{
LL height;
int left;
int right;
int index;
};
node nd[MAXN];
int n;
stack <node> st;//定义一个单调栈
void clr()
{
while(!st.empty())
st.pop();
}
LL work()
{
clr();
for(int i = ;i<=n;i++)
{
if(st.empty())
{
nd[i].left = i;
st.push(nd[i]);
}
else
{
node td = st.top();
if(td.height<nd[i].height)
{
nd[i].left = i;
st.push(nd[i]);
}
else
{
bool flag=false;
int c;
while(!st.empty())
{
if((st.top()).height>=nd[i].height)
{
c = (st.top()).left;
st.pop();
}
else
{
nd[i].left = c;
flag =true;
st.push(nd[i]);
break;
}
}
if(flag == false)
{
nd[i].left = c;
st.push(nd[i]);
}
}
}
}
clr();
for(int i = n;i>=;i--)
{
if(st.empty())
{
nd[i].right = i;
st.push(nd[i]);
}
else
{
node td = st.top();
if(td.height<nd[i].height)
{
nd[i].right = i;
st.push(nd[i]);
}
else
{
bool flag=false;
int c;
while(!st.empty())
{
if((st.top()).height>=nd[i].height)
{
c = (st.top()).right;
st.pop();
}
else
{
nd[i].right = c;
st.push(nd[i]);
flag = true;
break;
}
}
if(flag == false)
{
nd[i].right = c;
st.push(nd[i]);
}
}
}
}
LL maxs = ;
LL s;
for(int i = ;i<=n;i++)
{
s = (nd[i].right - nd[i].left + )*nd[i].height;
if(maxs<s)
maxs = s;
}
return maxs;
}
int main()
{
while(~scanf("%d",&n))
{
if(n==)
break;
for(int i = ;i<=n;i++)
{
nd[i].index = i;
scanf("%I64d",&nd[i].height);
}
cout<<work()<<endl;
}
return ;
}

hdu 1506 单调栈问题的更多相关文章

  1. hdu 1506 单调栈

    #include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a)) #defin ...

  2. hdu 5033 单调栈 ****

    看出来是单调栈维护斜率,但是不会写,2333,原来是和询问放在一起的 #include <iostream> #include <cstdio> #include <cs ...

  3. hdu 5875(单调栈)

    Function Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  4. HDU 5033 (单调栈维护凸包) Building

    题意: 一个人在x轴上,他的左右两侧都有高楼,给出楼的横坐标Xi和高度Hi还有人的位置pos,求人所能看到的天空的最大角度. 分析: 将建筑物和人的位置从左到右排序,对于每个位置利用栈求一次人左边建筑 ...

  5. hdu 4923 单调栈

    http://acm.hdu.edu.cn/showproblem.php?pid=4923 给定一个序列a,元素由0,1组成,求一个序列b,元素在0~1之间,并且保证递增.输出最小的∑(ai−bi) ...

  6. hdu 3410 单调栈

    http://acm.hdu.edu.cn/showproblem.php?pid=3410 Passing the Message Time Limit: 2000/1000 MS (Java/Ot ...

  7. hdu 1505 单调栈升级版

    #include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a)) #defin ...

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

    单调栈和队列讲解:传送门 HDU -1506题意: 就是给你一些矩形的高度,让你统计由这些矩形构成的那个矩形面积最大 如上图所示,如果题目给出的全部是递增的,那么就可以用贪心来解决 从左向右依次让每一 ...

  9. hdu 1506 Largest Rectangle in a Histogram(单调栈)

                                                                                                       L ...

随机推荐

  1. Mysql 学习1

      Mysql学习   一.数据库   1 数据库概念(了解) 1.1 什么是数据库 数据库就是用来存储和管理数据的仓库! 数据库存储数据的优先: 可存储大量数据: 方便检索: 保持数据的一致性.完整 ...

  2. Android N API预览

    Android N for Developers 重要的开发人员功能 多窗体支持 通知 JIT/AOT 编译 高速的应用安装路径 外出瞌睡模式 后台优化 Data Saver 高速设置图块 API 号 ...

  3. Linux 下 Crontab 命令使用详解 定时任务

    一.  Crontab 介绍 crontab命令的功能是在一定的时间间隔调度一些命令的运行. 1.1 /etc/crontab 文件 在/etc文件夹下有一个crontab文件,这里存放有系统运行的一 ...

  4. 目标检测--之RCNN

    目标检测--之RCNN 前言,最近接触到的一个项目要用到目标检测,还有我的科研方向caption,都用到这个,最近电脑在windows下下载数据集,估计要一两天,也不能切换到ubuntu下撸代码~.所 ...

  5. Redis持久化——多实例部署(四)

    Redis单线程架构导致无法充分利用CPU特性,通常的做法是在一台机器上部署多个实例. 当多个实例开启AOF重写后,彼此之间会产生对CPU和IO的竞争. 对于单机部署多Redis部署,如果同一时刻运作 ...

  6. 禁用chrome浏览器的cookie

    Chrome: 1.打开chrome浏览器,点击右上角的“自定义和控制Google Chrome”按钮 2.在下拉菜单中选择设置 3.点击设置页底部的“显示高级设置...” 4.在隐私设置下,点击“内 ...

  7. Python基础(2)_数字和字符串类型

    一.数据类型 1.数字 整型 Python的整型相当于C中的long型,Python中的整数可以用十进制,八进制,十六进制表示. >>> --------->默认十进制 > ...

  8. 使用documentFragment

    function insertHtml(range, val) { var doc = range.doc, frag = doc.createDocumentFragment(); K('@' + ...

  9. SQL语法结构

    目录 一.增 1.增加字段 2.新建约束 二.删 1.删除字段 2.删除约束 三.改 1.修改字段 一.增 1.增加字段: ALTER TABLE [表名] ADD [字段名] NVARCHAR () ...

  10. iOS UITableViewCell UITableVIewController 纯代码开发

    iOS UITableViewCell UITableVIewController 纯代码开发 <原创> .纯代码 自定义UITableViewCell 直接上代码 ////// #imp ...