题意:求一个直方图中最大矩形的面积。

很经典的一道问题了吧,可以用单调栈分别求出每个柱子左右两边第一个比它低的柱子(也就相当于求出了和它相连的最后一个比它高的柱子),确定每个柱子的左右边界,每个柱子的高度乘上左右边界的宽度求最大值就行了。

也可以用笛卡尔树上dp的方法搞一搞,即用每个结点权值和所在子树的大小分别表示高度和宽度。(建笛卡尔树的过程也用到了单调栈,作用是维护右链)

单调栈做法:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int N=1e5+,inf=0x3f3f3f3f;
  5. int a[N],n,sta[N],L[N],R[N],tp;
  6.  
  7. int main() {
  8. while(scanf("%d",&n)&&n) {
  9. a[]=a[n+]=-;
  10. for(int i=; i<=n; ++i)scanf("%d",&a[i]);
  11. sta[tp=]=;
  12. for(int i=; i<=n; ++i) {
  13. for(; a[sta[tp]]>=a[i]; --tp);
  14. L[i]=sta[tp]+,sta[++tp]=i;
  15. }
  16. sta[tp=]=n+;
  17. for(int i=n; i>=; --i) {
  18. for(; a[sta[tp]]>=a[i]; --tp);
  19. R[i]=sta[tp]-,sta[++tp]=i;
  20. }
  21. ll ans=;
  22. for(int i=; i<=n; ++i)ans=max(ans,(ll)a[i]*(R[i]-L[i]+));
  23. printf("%lld\n",ans);
  24. }
  25. return ;
  26. }

笛卡尔树做法:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int N=1e5+,inf=0x3f3f3f3f;
  5. int n,a[N];
  6. struct Cartesian {
  7. static const int N=1e5+;
  8. int ls[N],rs[N],val[N],siz[N],sta[N],tp,tot;
  9. int newnode(int x) {int u=tot++; ls[u]=rs[u]=siz[u]=,val[u]=x; return u;}
  10. void build(int* a,int n) {
  11. tot=,newnode(),sta[tp=]=newnode(-);
  12. for(int i=; i<n; ++i) {
  13. int u=newnode(a[i]);
  14. for(; val[sta[tp]]>=val[u]; --tp);
  15. ls[u]=rs[sta[tp]],rs[sta[tp]]=u;
  16. sta[++tp]=u;
  17. }
  18. }
  19. void dfs(int u=) {
  20. if(!u)return;
  21. dfs(ls[u]),dfs(rs[u]);
  22. siz[u]=siz[ls[u]]+siz[rs[u]]+;
  23. }
  24. } cart;
  25.  
  26. int main() {
  27. while(scanf("%d",&n)&&n) {
  28. for(int i=; i<n; ++i)scanf("%d",&a[i]);
  29. cart.build(a,n);
  30. cart.dfs();
  31. ll ans=;
  32. for(int i=; i<cart.tot; ++i)ans=max(ans,(ll)cart.siz[i]*cart.val[i]);
  33. printf("%lld\n",ans);
  34. }
  35. return ;
  36. }

HDU - 1506 Largest Rectangle in a Histogram (单调栈/笛卡尔树)的更多相关文章

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

                                                                                                       L ...

  2. HDU 1506 Largest Rectangle in a Histogram(单调栈、笛卡尔树)

    题意:给定n个连续排列的矩形的高,矩形的宽都为1.问最大矩形覆盖. 例如:n = 7,h[i] = (2 1 4 5 1 3 3),最大覆盖为8. Sample Input 7 2 1 4 5 1 3 ...

  3. HDU 1506 Largest Rectangle in a Histogram (dp左右处理边界的矩形问题)

    E - Largest Rectangle in a Histogram Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format: ...

  4. HDU 1506 Largest Rectangle in a Histogram set+二分

    Largest Rectangle in a Histogram Problem Description: A histogram is a polygon composed of a sequenc ...

  5. hdu 1506 Largest Rectangle in a Histogram 构造

    题目链接:HDU - 1506 A histogram is a polygon composed of a sequence of rectangles aligned at a common ba ...

  6. HDU 1506 Largest Rectangle in a Histogram(区间DP)

    题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1506 题目: Largest Rectangle in a Histogram Time Limit: ...

  7. DP专题训练之HDU 1506 Largest Rectangle in a Histogram

    Description A histogram is a polygon composed of a sequence of rectangles aligned at a common base l ...

  8. Hdu 1506 Largest Rectangle in a Histogram 分类: Brush Mode 2014-10-28 19:16 93人阅读 评论(0) 收藏

    Largest Rectangle in a Histogram Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  9. hdu 1506 Largest Rectangle in a Histogram——笛卡尔树

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1506 关于笛卡尔树的构建:https://www.cnblogs.com/reverymoon/p/952 ...

随机推荐

  1. admin 模块功能

    class CustomModelAdmin(admin.ModelAdmin): def has_module_permission(self, request): 是否会显示model def h ...

  2. LeetCode:数据库技术【180-185】

    LeetCode:数据库技术[180-185] 180.连续出现的数字 题目描述 编写一个 SQL 查询,查找所有至少连续出现三次的数字. +----+-----+ | Id | Num | +--- ...

  3. Python 2 一些实用模块的使用

    time模块,sys模块,os模块,random模块, shutil模块, json & pickle 模块,re模块 time模块: 在Python中,通常有这几种方式来表示时间:1)时间戳 ...

  4. iOS 11 Xcode9开发 新特性学习 (警告篇)

    最新版本SDK优化了开发体验,编译过程会提供更多提示警告,建议你修改.这些功能也可以自主选择用或者不用,当然,苹果喜欢你用他推荐的东西... 1 . @avalibale 语法,同步判断当前iOS系统 ...

  5. 安装mysql到ubuntu

    Ubuntu 16.04上安装MySQL步骤: 如果你使用的是Ubuntu 16.04以前的版本,可以看这里:Ubuntu 14.04/15.10升级到Ubuntu 16.04 LTS.一. 安装My ...

  6. 使用SQL Server Management Studio 创建数据库备份作业

    --完整备份,每周一次USE MasterGOdeclare @str varchar(100)set @str='D:\Weldon\DBBACK\FullBak'+replace(replace( ...

  7. C#无边框窗体移动的三种方法

    1. 重写WndProc protected override void WndProc(ref Message m) { const int WM_NCHITTEST = 0x84; const i ...

  8. ACM训练小结-2018年6月14日

    于恢复性训练Day2情况如下:https://vjudge.net/contest/234651    先看A题,读懂题意,没有想明白,码完后连续多次WA,后找到错误AC.    对B题,发现其是一个 ...

  9. 大话设计模式之PHP篇 - 适配器模式

    定义将一个类的接口转换成客户希望的另外一个接口,使用原本不兼容的而不能在一起工作的那些类可以在一起工作. 角色Target适配目标,该角色定义把其他类转换为何种接口,也就是我们的期望接口.Adapte ...

  10. 关于读取本地text文件,自动被添加空格的问题

    最近做一个小程序,读取本地指定路径下的text文件,逐行获取text文本然后再进行处理,结果遇到了一个奇葩问题,先插个图片给各位看官 坑:本地text文件中数据为1123/10(数据反复检查无空格,换 ...