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

题意:给定一个统计直方图,n个矩形条,每个矩形条宽1,高0-10^9,求最大矩形面积。

分析:天然的笛卡尔树,以输入的顺序为第一关键字,矩形条的高为第二关键字建立一颗笛卡尔树,并且是一个小堆。那么从

树根开始后序遍历整颗树,在节点处结算一次保存最大值。建树O(n),遍历树也是O(n),所以总的时间复杂度也是O(n)。

首先笛卡尔树是一个二叉排序树,那么以输入顺序作为二叉排序树的关键字,所建出来的树保证以任意节点为根的子树的所有

节点是连续的,然后笛卡尔树以矩形条的高度为关键字又有堆的性质,而这题的关键不就正是要找连续的矩形条,使总面积最

大,而决定大矩形高度的就是每个小矩形条的最小高度!那么我们维护一个小堆即可,这样在每个节点处就保证以该节点为根

的子树所能构成的最大矩形就是该节点的高度*该子树的大小。

#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
typedef long long LL;
const int N=100005;
const LL INF=(LL)1<<62;
struct node
{
LL fix;
int pre,l,r;
void clear()
{
pre=l=r=0;
}
};
node T[N];
LL ans;
void Init(int n)
{
for(int i=0;i<=n;i++)
T[i].clear();
T[0].fix=-INF;
}
int Build(int n)
{
for(int i=1; i<=n; i++)
{
int j=i-1;
while(T[j].fix>T[i].fix)
j=T[j].pre;
T[i].l=T[j].r;
T[j].r=i;
T[i].pre=j;
}
return T[0].r;
}
int dfs(int cur)
{
if(cur==0) return 0;
LL num=dfs(T[cur].l)+dfs(T[cur].r)+1;
LL tmp=num*T[cur].fix;
if(tmp>ans) ans=tmp;
return num;
}
void print(int cur)
{
if(cur==0) return;
printf("%d\n",T[cur].fix);
print(T[cur].l);
print(T[cur].r);
}
int main()
{
int n;
while(~scanf("%d",&n),n)
{
Init(n);
for(int i=1;i<=n;i++)
scanf("%I64d",&T[i].fix);
int root=Build(n);
ans=0;
dfs(root);
printf("%I64d\n",ans);
}
return 0;
}

HDU1506(天然的笛卡尔树)相关推荐

  1. 技术情报局(笛卡尔树)

    problem 有这样一道简单题:给定一个序列求所有区间的最大值的和. 还有这样一道简单题:给定一个序列求所有区间的乘积的和. 众所周知:简单题 + 简单题 = 简单题. 所以,给定一个长为 nnn ...

  2. HDU - 6305 RMQ Similar Sequence(笛卡尔树)

    http://acm.hdu.edu.cn/showproblem.php?pid=6305 题目 对于A,B两个序列,任意的l,r,如果RMQ(A,l,r)=RMQ(B,l,r),B序列里的数为[0 ...

  3. [算法学习] 线段树,树状数组,数堆,笛卡尔树

    都是树的变种,用途不同 [线段树 Interval Tree] 区间管理,是一种平衡树 可看做是对一维数组的索引进行管理.一维数组不需要是排序好的 深度不超过logL 任一个区间(线段)都分成不超过2 ...

  4. 洛谷 - P4755 Beautiful Pair(笛卡尔树+主席树)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数列 a,现在一个数对 ( i , j ) 如果满足 a[ i ] * a[ j ] <=max( a[ i ] ~ a[ j ] ),则称其 ...

  5. 牛客多校3 - Sort the Strings Revision(笛卡尔树+分治)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数字串 s[ 0 ],每个位置的赋值初始时为 s[ i ] = i % 10 ( i ∈ [ 0 , n - 1 ] ),现在有一个长度为 n 的排 ...

  6. 牛客 - sequence(笛卡尔树+线段树)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数列 a 和数列 b ,求 题目分析:不算难的题目,对于每个 a[ i ] 求一下贡献然后维护最大值就好,具体思路就是,先找出每个 a[ i ] 左 ...

  7. POJ - 2559 Largest Rectangle in a Histogram(笛卡尔树,单调栈实现)

    题目链接:点击查看 题目大意:给出一排高度不同,宽度都为 1 的矩形,问拼起来后最大的矩形面积是多少 题目分析:普通做法是用单调栈直接维护,我一直觉得单调栈处理这种矩形问题都比较抽象,也可能是我太菜了 ...

  8. POJ - 2201 Cartesian Tree(笛卡尔树-单调栈/暴跳父亲)

    题目链接:点击查看 题目大意:给出n个节点的key和val,构造出其笛卡尔树的原型 笛卡尔树的定义: 所谓笛卡尔树,就是将给定的n个二元组(key,val)建成一棵树.使得: 如果只关注key,那么这 ...

  9. POJ1785(笛卡尔树的构造)

    题目:http://poj.org/problem?id=1785 题意:构造笛卡尔树,这里是最大堆构造,然后以广义表的形式输出这棵笛卡尔树. #include <iostream> #i ...

最新文章

  1. sql 集合查询 数据更新操作语句
  2. 《众妙之门——Web用户体验设计与可用性测试》一2.3 总结
  3. shell中while循环案例
  4. Nginx URL 重写
  5. metadata usage in the runtime
  6. c 函数多次声明_C++核心准则C.132:不要没有理由就将函数声明为虚函数
  7. 用dynamic增强C#泛型表达力
  8. WinCE应用程序产生Data Abort 错误分析
  9. postgre SQL 中的 触发器 (实例应用,如何备份更新之前的差分数据)
  10. 大数据分析平台由哪些部分构成
  11. 给应用程序注入钩子程序
  12. 二十七、商城 - 搜索解决方案-Solr(15)【1】
  13. 【DSP】DSP2833x.h中定义的指令EINT、DINT、ERTM、DRTM、EALLOW、EDIS、ESTOP0的含义
  14. 声纹鉴定(语音同一性司法鉴定)是什么?
  15. 如何使用 forestplot 包绘制森林图展示多个效应的大小
  16. 视频网站提取原始地址之二——土豆
  17. 深入CC3200(1)—芯片简介及学习方法
  18. 怎么使用下载的建站公司网站源码搭建自己的企业网站
  19. JDBC实现四六级考试记录添加、查询、删除功能
  20. CAD-强电常用符号集

热门文章

  1. HTTP协议通信原理
  2. 依赖注入的细节_value子标签_特殊字符的注入
  3. 分区数据导出功能(服务端实现)
  4. 日志规范之了解slf4j
  5. 有状态服务和无状态服务的区别与联系
  6. Servlet_urlpartten配置
  7. 守护线程与非守护线程
  8. 分析时间复杂度和空间复杂度(一级)
  9. 云服务器维护人员,云服务器维护工作难吗
  10. linux 基本指令