hdu_1506:Largest Rectangle in a Histogram 【单调栈】
对栈的一种灵活运用吧算是,希望我的注释写的足够清晰。。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL; const int N=;
int Stack[N]; //Stack[]为单调栈(即每次能入栈的元素值必比栈顶元素(若存在)要大)
int len[N]; //len[]与Stack[]同步 ,记录的是从Stack[]中对应元素起向左最大可延伸的宽度
int n;
LL top,ans,h; void print()
{
printf("top=%d, ans=%d\n",top,ans);
printf("\tStack:");
for(int i=;i<=top;i++)
printf("%6d",Stack[i]);
puts("");
printf("\t len:");
for(int i=;i<=top;i++)
printf("%6d",len[i]);
puts("");
} int main()
{
while(scanf("%d",&n)&&n)
{
memset(Stack,,sizeof(Stack));
memset(len,,sizeof(len));
top=-,ans=;
for(int i=; i<=n; i++)
{
if(i<n) scanf("%lld",&h);
else h=-; //用作结束标记
if(top<||Stack[top]<h)
{
Stack[++top]=h; // h入栈
len[top]=; // 显然新入栈元素比原栈顶元素大,此时向左最大延伸“1”宽度
} // “1”可根据具体题目进行修改~
else // if(top>=0&&Stack[top]>=h
{
int l=;
while(Stack[top]>=h&&top>=)
{
ans=max(ans,(LL)(len[top]+l)*Stack[top]); //更新ans
l+=len[top--]; //Stack[]和len[]同时将栈顶元素弹出
} //循环结束后, top<0||Stack[top]<h
if(h>)
{
Stack[++top]=h; // h入栈
len[top]=l+; // 以top为起点的最长连续(h>=Stack[top])的区间长度
}
}
// print();
}
printf("%lld\n",ans);
}
}
hdu_1506:Largest Rectangle in a Histogram 【单调栈】的更多相关文章
- poj 2559 Largest Rectangle in a Histogram - 单调栈
Largest Rectangle in a Histogram Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 19782 ...
- POJ 2559 Largest Rectangle in a Histogram(单调栈)
传送门 Description A histogram is a polygon composed of a sequence of rectangles aligned at a common ba ...
- POJ 2559 Largest Rectangle in a Histogram (单调栈或者dp)
Largest Rectangle in a Histogram Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 15831 ...
- hdu 1506 Largest Rectangle in a Histogram(单调栈)
L ...
- po'j2559 Largest Rectangle in a Histogram 单调栈(递增)
Largest Rectangle in a Histogram Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 29498 ...
- POJ2559 Largest Rectangle in a Histogram —— 单调栈
题目链接:http://poj.org/problem?id=2559 Largest Rectangle in a Histogram Time Limit: 1000MS Memory Lim ...
- HDU - 1506 Largest Rectangle in a Histogram (单调栈/笛卡尔树)
题意:求一个直方图中最大矩形的面积. 很经典的一道问题了吧,可以用单调栈分别求出每个柱子左右两边第一个比它低的柱子(也就相当于求出了和它相连的最后一个比它高的柱子),确定每个柱子的左右边界,每个柱子的 ...
- POJ2559 Largest Rectangle in a Histogram 单调栈
题目大意 有一个直方图,其所有矩形的底均是1(以后简称小矩形).给出这些矩形的高度,求这些矩形的并集中存在的面积最大的矩形(简称大矩形)的面积. 题解 大矩形的高必然一边等于一个小矩形的高,另一边小于 ...
- PKU 2559 Largest Rectangle in a Histogram(单调栈)
题目大意:原题链接 一排紧密相连的矩形,求能构成的最大矩形面积. 为了防止栈为空,所以提前加入元素(-1,0) #include<cstdio> #include<stack> ...
- Largest Rectangle in a Histogram /// 单调栈 oj23906
题目大意: 输入n,,1 ≤ n ≤ 100000,接下来n个数为每列的高度h ,0 ≤ hi ≤ 1000000000 求得最大矩阵的面积 Sample Input 7 2 1 4 5 1 3 34 ...
随机推荐
- 用JQuery写的滚动条,可以改变样式哦!
很早之前在做项目的时候要用到自定义的滚动条,可是现在的CSS2只能改改颜色什么的,对于改变形状或者更高级的用法根本不可能实现,没办法只能自己写一个了.(好像CSS3可以该形状,不过没研究过有兴趣的童鞋 ...
- Python 操作 Azure Blob Storage
笔者在<Azure 基础:Blob Storage>一文中介绍了 Azure Blob Storage 的基本概念,并通过 C# 代码展示了如何进行基本的操作.最近笔者需要在 Linux ...
- Bootstrap & 响应式
要了解一个东西 就是要知道 它是什么? 干什么 ? 怎么用 ? 1.Bootstrap 简介 Bootstrap 是由Twitter(著名的社交网站)推出的前端开源工具包,它基于Html.CSS. ...
- [codeforces113D]Museum
D. Museum time limit per test: 2 seconds memory limit per test: 256 megabytes input: standard input ...
- C++将一个数组内容赋给另一个数组
有两种方式: 一.进行数组遍历,依次赋值 ] = { , , , , }; ] ={ }; ;i<sizeof(arr1)/sizeof(int);i++) arr2[i] = arr1[i] ...
- Linux网络编程“惊群”问题总结
1.前言 我从事Linux系统下网络开发将近4年了,经常还是遇到一些问题,只是知其然而不知其所以然,有时候和其他人交流,搞得非常尴尬.如今计算机都是多核了,网络编程框架也逐步丰富多了,我所知道的有多进 ...
- Struts2 Action接收POST请求JSON数据及其实现解析
一.认识JSON JSON是一种轻量级.基于文本.与语言无关的数据交换格式,可以用文本格式的形式来存储或表示结构化的数据. 二.POST请求与Content-Type: application/jso ...
- svn怎么切换用户
在使用svn客户端经常会保存用户及密码,方便下次直接登录,有时需要使用别的账号登录,这时该怎么切换呢? 工具/原料 苹果6 小米4 方法/步骤 在使用svn更新或提交数据时需要输入用户名和密码,在 ...
- [leetcode-556-Next Greater Element III]
Given a positive 32-bit integer n, you need to find the smallest 32-bit integer which has exactly th ...
- 【原创】源码角度分析Android的消息机制系列(六)——Handler的工作原理
ι 版权声明:本文为博主原创文章,未经博主允许不得转载. 先看Handler的定义: /** * A Handler allows you to send and process {@link Mes ...