poj 2559 & hdu 1506 Largest Rectangle in a Histogram 笛卡尔树
来源:互联网 发布:金山软件管家下载 编辑:程序博客网 时间:2024/06/05 02:08
题目:
http://poj.org/problem?id=2559
题意:
有n个高度不等的矩形,问这些矩形的所能组成的新矩形的最大面积
思路:
单调栈,dp都可以做,笛卡尔树也可以做。按出现的次序做val,矩形高度做pri,然后O(n)建小顶堆的笛卡尔树,可以惊奇的发现,对于树上的每个节点,以它作为高的新矩形的面积就是以它为根的子树大小乘以它的高,为什么会这样?仔细想想构建小顶堆的笛卡尔树过程,就明白了
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;typedef long long ll;const int N = 100000 + 10, INF = 0x3f3f3f3f;struct node{ int val, pri, fat, son[2]; friend bool operator< (node a, node b) { return a.val < b.val; } void init(int _val, int _pri, int _fat) { val = _val, pri = _pri, fat = _fat; son[0] = son[1] = 0; }}tr[N];int root;int top, stk[N];ll ans;//int cartesian_build(int n)//{// top = 0;// for(int i = 1; i <= n; i++)// {// int k = top;// while(k > 0 && tr[stk[k-1]].pri > tr[i].pri) k--;// if(k != 0)// {// tr[i].fat = stk[k-1];// tr[stk[k-1]].son[1] = i;// }// if(k != top)// {// tr[stk[k]].fat = i;// tr[i].son[0] = stk[k];// }// stk[k++] = i;// top = k;// }// return stk[0];//}//另外一种O(n)构建笛卡尔树的方式,特点是代码很短int cartesian_build(int n){ for(int i = 1; i <= n; i++) { int k = i - 1; while(tr[k].pri > tr[i].pri) k = tr[k].fat; tr[i].son[0] = tr[k].son[1]; tr[k].son[1] = i; tr[i].fat = k; tr[tr[i].son[0]].fat = i;//很多人没加这句,父节点关系就会乱掉,但到目前为止交到OJ上不会发生错误,因为此时这个点已不在最右链上,不会用到其父节点了 } return tr[0].son[1];}int dfs(int x){ if(! x) return 0; int sz = dfs(tr[x].son[0]); sz += dfs(tr[x].son[1]); ans = max(ans, (ll)(sz + 1) * tr[x].pri); return sz + 1;}int main(){ int n, a; while(scanf("%d", &n), n) { tr[0].init(0, 0, 0); for(int i = 1; i <= n; i++) { scanf("%d", &a); tr[i].init(i, a, 0); } root = cartesian_build(n); ans = 0; dfs(root); printf("%lld\n", ans); } return 0;}
阅读全文
0 0
- poj 2559 & hdu 1506 Largest Rectangle in a Histogram 笛卡尔树
- poj 2559 hdu 1506 Largest Rectangle in a Histogram
- hdu 1506/poj 2559 Largest Rectangle in a Histogram
- poj2559 & zoj1985 &hdu1506 Largest Rectangle in a Histogram(笛卡尔树)
- hdu1506 Largest Rectangle in a Histogram (笛卡尔树)
- poj 2559 Largest Rectangle in a Histogram
- POJ 2559 - Largest Rectangle in a Histogram
- poj 2559 Largest Rectangle in a Histogram
- POJ 2559 Largest Rectangle in a Histogram
- poj 2559 Largest Rectangle in a Histogram
- 【poj 2559】Largest Rectangle in a Histogram
- poj 2559 Largest Rectangle in a Histogram
- POJ 2559 Largest Rectangle in a Histogram
- POJ 2559 Largest Rectangle in a Histogram
- poj 2559 Largest Rectangle in a Histogram
- POJ 2559 Largest Rectangle in a Histogram
- POJ 2559 Largest Rectangle in a Histogram
- POJ 2559 Largest Rectangle in a Histogram
- Java邮件开发(二):使用JMail发送一封图文并茂且包含附件的邮件(上)
- HDU 4417 Super Mario(线段树||树状数组+离线操作 之树状数组篇)
- c++中namespace(命名空间)
- 欢迎使用CSDN-markdown编辑器
- Spring Cloud Eureka Server HA With Docker
- poj 2559 & hdu 1506 Largest Rectangle in a Histogram 笛卡尔树
- 请编写一个C函数,该函数将一个字符串逆序
- python 正则表达式元字符详细介绍
- mysql存储emoji表情(utf8mb4编码)报错
- Flume直接到SparkStreaming的两种方式
- 002-20161115-2光明回应读者无限关于“佛家、道家,道家三清”的问题
- RSA实践
- ros 节点实现简易超声雷达串口通讯 模拟出激光雷达消息
- fancyTree学习笔记