单调栈裸题

如果矩形高度从左到右是依次递增,那我们枚举每个矩形高度,宽度拉到最优,计算最大面积即可

当有某个矩形比前一个矩形要矮的时候,这块面积的高度就不能大于他本身,所以之前的所有高于他的矩形多出来的部分都没用了,不会再计算第二次。

因此我们只需要用单调栈维护矩形高度即可,当有高度较低的矩形进栈时,先将之前比他高的每个矩形弹出,宽度累加,更新答案。然后我们要进栈的矩形的宽度也要变成之前累加的宽度+1,因为要保留有用部分。。

有个小技巧:为了方便程序,在末尾加一个高度为0的矩形

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
inline int lowbit(int x){ return x & (-x); }
inline int read(){int X = 0, w = 0; char ch = 0;while(!isdigit(ch)) { w |= ch == '-'; ch = getchar(); }while(isdigit(ch)) X = (X << 3) + (X << 1) + (ch ^ 48), ch = getchar();return w ? -X : X;
}
inline int gcd(int a, int b){ return a % b ? gcd(b, a % b) : b; }
inline int lcm(int a, int b){ return a / gcd(a, b) * b; }
template<typename T>
inline T max(T x, T y, T z){ return max(max(x, y), z); }
template<typename T>
inline T min(T x, T y, T z){ return min(min(x, y), z); }
template<typename A, typename B, typename C>
inline A fpow(A x, B p, C yql){A ans = 1;for(; p; p >>= 1, x = 1LL * x * x % yql)if(p & 1)ans = 1LL * x * ans % yql;return ans;
}
ll h[100005], s[100005], w[100005], tot;
int main(){int n;while(cin >> n && n){memset(h, 0, sizeof h);memset(s, 0, sizeof s);memset(w, 0, sizeof w);ll ans = 0; w[n + 1] = 0; tot = 0;for(int i = 1; i <= n; i ++) cin >> h[i];for(int i = 1; i <= n + 1; i ++){if(s[tot] > h[i]){ll width = 0;while(tot > 0 && s[tot] > h[i]){width += w[tot];ans = max(ans, (ll)width * s[tot]);tot --;}s[++tot] = h[i], w[tot] = width + 1;}else{s[++tot] = h[i], w[tot] = 1;}}printf("%lld\n", ans);}return 0;
}

转载于:https://www.cnblogs.com/onionQAQ/p/10519371.html

HDU1506 Largest Rectangle in a Histogram(算竞进阶习题)相关推荐

  1. POJ 2942 Knights of the Round Table (算竞进阶习题)

    很巧的一道点双 两个骑士如果相互憎恨,我们考虑连边的话,不太好处理答案,所以我们尝试一下建反图. 如果两个骑士没有相互憎恨,我们就在他们两个人之间连一条无向边,最后要让你会议召开,那么显然是选择任意一 ...

  2. POJ 3974 Palindrome (算竞进阶习题)

    hash + 二分答案 数据范围肯定不能暴力,所以考虑哈希. 把前缀和后缀都哈希过之后,扫描一边字符串,对每个字符串二分枚举回文串长度,注意要分奇数和偶数 #include <iostream& ...

  3. CF 670C Cinema(算竞进阶习题)

    离散化+排序 离散化统计人数就好,本来不难,但是测试点太丧心病狂了...CF还是大哥啊 #include <bits/stdc++.h> #define INF 0x3f3f3f3f us ...

  4. POJ 3683 Priest John's Busiest Day (算竞进阶习题)

    2-SAT 可以把每一次仪式看成变量,0/1的取值分别为开头举行和结尾举行. 转换为2-SAT接受的命题,就是看某一次仪式中有没有重合的时间段,有的话,就按照不冲突的形式连有向边. 然后跑tarjan ...

  5. POJ 2245 Addition Chains(算竞进阶习题)

    迭代加深dfs 每次控制序列的长度,依次加深搜索 有几个剪枝: 优化搜索顺序,从大往下枚举i, j这样能够让序列中的数尽快逼近n 对于不同i,j和可能是相等的,在枚举的时候用过的数肯定不会再被填上所以 ...

  6. POJ 3322 Bloxorz(算竞进阶习题)

    bfs 标准广搜题,主要是把每一步可能的坐标都先预处理出来,会好写很多 每个状态对应三个限制条件,x坐标.y坐标.lie=0表示直立在(x,y),lie=1表示横着躺,左半边在(x,y),lie=2表 ...

  7. *【HDU - 1506】【POJ - 2559】Largest Rectangle in a Histogram(单调栈或动态规划)

    题干: Description A histogram is a polygon composed of a sequence of rectangles aligned at a common ba ...

  8. poj 2559 Largest Rectangle in a Histogram 栈

    // poj 2559 Largest Rectangle in a Histogram 栈 // // n个矩形排在一块,不同的高度,让你求最大的矩形的面积(矩形紧挨在一起) // // 这道题用的 ...

  9. HDU 1506 Largest Rectangle in a Histogram(dp、单调栈)

    你是不是飘了?骚年! Problem Description A histogram is a polygon composed of a sequence of rectangles aligned ...

最新文章

  1. linux VM映像chroot注入修改root密码
  2. 没有c语言基础可以学python吗-必须要有C语言基础才能学python吗
  3. 过河 2005年NOIP全国联赛提高组(离散化+dp)
  4. 诸法无我-悉达多 乔达摩
  5. 从表到里学习JVM实现
  6. 单步调试学习WordPress PHP文件的加载顺序
  7. [PAT乙级]1016 部分A+B
  8. USACO2.4のP1522-牛的旅行(Cow Tours)【最短路Flody】
  9. QT学习笔记(十二):透明窗体设置
  10. android 跳转权限管理的代码,Android权限管理
  11. [Java][web]利用Spring随时随地获得Request和Session
  12. poj1163 数字三角形 (动态规划)
  13. Linux下xargs命令的使用
  14. 衡量视频序列特性的TI(时间信息)和SI(空间信息)
  15. 美国大选数据挖掘相关论文笔记(A 61-million-person experiment in social influence and political mobilization)...
  16. linux中send函数,Linux系统调用之send/sendto/sendmsg函数解析
  17. LRO (大量接收减负)
  18. 试验设计方法与Design-Expert软件应用目录
  19. python结合mitmproxy抓包实践
  20. UE4 材质学习 (焚烧材质)

热门文章

  1. 这是我看过最全的工业机器人知识介绍 !
  2. 重磅盘点:过去8年中深度学习最重要的想法
  3. 分析 | MEMS传感器市场报告
  4. 是否顺应互联网大脑的发育趋势决定科技企业兴衰
  5. 【机器视觉】机器视觉产业链
  6. 宇宙和你,本质上其实只是个八维数字?
  7. 176页报告辟谣自动化时代的就业危机(附下载)
  8. 传感器数据完善 AI 功能,激起机器人“网络效应”
  9. 腾讯AI战略详解:技术社会与创新图景 | 2017互联网科技创新白皮书重磅首发
  10. “计算机艺术之父”、现代计算机技术先驱查理斯·苏黎去世,享年99岁