POJ 1785 Binary Search Heap Construction(裸笛卡尔树的构造)
笛卡尔树:
每个节点有2个关键字key、value。从key的角度看,这是一颗二叉搜索树,每个节点的左子树的key都比它小,右子树都比它大;从value的角度看,这是一个堆。
题意:以字符串为关键字key,数字为关键字value,构造一个二叉搜索大堆,最后按要求中序遍历 笛卡尔树的构造。
建立笛卡尔树的O(n)的算法:
从别人博客里拷贝过来的,这里给出链接:http://hi.baidu.com/yy17yy/item/cd4edcf963944f6a3d148553
首先按key关键字进行排序,这样建树的时候从左下角往右下角建。根据定义可知,每个数组的末尾节点必是位于树的最右路上且不可能有右孩子。 在建立树的过程中每次加入一个元素A[X],则该节点一定位于此时的树的最右路上且无右孩子。所以只要沿着A[X-1]节点向上走, 找到比A[X]大的第一个节点A[K],则A[X]是A[K]的右孩子,且A[K]原来的右孩子此时将成为A[X]的左孩子。 若找不到A[K]则此时的树的根将作为A[X]的左孩子,A[X]将成为树的新的根节点。
可以模拟一个虚根,其priority设为无穷,这样最后构造出来的树即为虚根的右子树,方便编写程序。
我原来排序时,是自己写了比较器,传给sort方法,969MS。后来在Node结构体中重载运算符<,625MS。
代码中scanf的用法,详见:http://blog.csdn.net/wesweeky/article/details/6439777
#include <iostream>
#include <cstdio>
#include <string.h>
#include <queue>
#include <algorithm>
#include <string> using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=<<;
int fa[maxn]; //存储父节点的编号
int son[maxn][]; //son[i][0]存储i的左儿子编号,son[i][1]存储i的右儿子编号
int n; struct Node{
char s[]; //字符串
int p; //优先级
bool operator<(const Node tmp)const{
return strcmp(s,tmp.s)<;
}
}node[maxn];
/*
bool cmp(const Node tmp1,const Node tmp2){
if(strcmp(tmp1.s,tmp2.s)<0)
return 1;
else
return 0;
}
*/
void treap(int i){
int tmp=i-;
//直到找到一个tmp,使得tmp的优先级大于i
while(node[tmp].p<node[i].p){
tmp=fa[tmp];
}
//tmp的原先的右儿子即为i的左儿子,i成为tmp的右儿子
son[i][]=son[tmp][];
son[tmp][]=i;
fa[i]=tmp;
}
//中序遍历
void dfs(int i){
if(i==)
return;
printf("(");
//递归左儿子
dfs(son[i][]);
printf("%s/%d",node[i].s,node[i].p);
//递归右儿子
dfs(son[i][]);
printf(")");
}
int main()
{
//这里为方便起见,设立了一个优先级很大的虚根,之后建的树为虚根的右子树
node[].p=INF;
while(scanf("%d",&n),n){
memset(son,,sizeof(son));
memset(fa,-,sizeof(fa));
for(int i=;i<=n;i++){
//[a-z]表示读取的字符串由a-z中的字符组成,其余的字符为定界符
scanf(" %[a-z]/%d",node[i].s,&node[i].p);
}
//sort(node+1,node+n+1,cmp);
sort(node+,node+n+);
for(int i=;i<=n;i++){
treap(i);
}
//从虚根的右儿子开始dfs
dfs(son[][]);
printf("\n");
}
return ;
}
POJ 1785 Binary Search Heap Construction(裸笛卡尔树的构造)的更多相关文章
- [POJ1785]Binary Search Heap Construction(笛卡尔树)
Code #include <cstdio> #include <algorithm> #include <cstring> #define N 500010 us ...
- 笛卡尔树 POJ ——1785 Binary Search Heap Construction
相应POJ 题目:点击打开链接 Binary Search Heap Construction Time Limit: 2000MS Memory Limit: 30000K Total Subm ...
- POJ 1785 Binary Search Heap Construction (线段树)
题目大意: 给出的东西要求建立一个堆,使得后面的数字满足堆的性质.并且字符串满足搜索序 思路分析: 用线段树的最大询问建树.在建树之前先排序,然后用中序遍历递归输出. 注意输入的时候的技巧. .. # ...
- ZOJ - 2243 - Binary Search Heap Construction
先上题目: Binary Search Heap Construction Time Limit: 5 Seconds Memory Limit: 32768 KB Read the sta ...
- POJ 2559 Largest Rectangle in a Histogram ——笛卡尔树
[题目分析] 本来是单调栈的题目,用笛卡尔树可以快速的水过去. 把每一个矩阵看成一个二元组(出现的顺序,高度). 然后建造笛卡尔树. 神奇的发现,每一个节点的高度*该子树的大小,就是这一块最大的子矩阵 ...
- poj1785 Binary Search Heap Construction
此题可以先排序再用rmq递归解决. 当然可以用treap. http://poj.org/problem?id=1785 #include <cstdio> #include <cs ...
- 牛客多校第一场 A Equivalent Prefixes 单调栈(笛卡尔树)
Equivalent Prefixes 单调栈(笛卡尔树) 题意: 给出两个数组u,v,每个数组都有n个不同的元素,RMQ(u,l,r)表示u数组中[l,r]区间里面的最小值标号是多少,求一个最大的m ...
- [hdu1506 Largest Rectangle in a Histogram]笛卡尔树
题意:http://acm.hdu.edu.cn/showproblem.php?pid=1506 如图,求最大的矩形面积 思路: 笛卡尔树:笛卡尔树是一棵二叉树,树的每个节点有两个值,一个为key, ...
- POJ-1785-Binary Search Heap Construction(笛卡尔树)
Description Read the statement of problem G for the definitions concerning trees. In the following w ...
随机推荐
- 利用word2vec对关键词进行聚类
1.收集预料 自己写个爬虫去收集网页上的数据. 使用别人提供好的数据http://www.sogou.com/labs/dl/ca.html 2.对预料进行去噪和分词 我们需要content其中的值, ...
- vs2008团队资源管理器安装步骤
1.先装 VS2008TeamExplorer { NOTE: 要区分中英文版本Microsoft Visual Studio 2008 Service Pack 1 (iso) VS2008SP1C ...
- 在项目中 background transiton 带来的"便利"与“坑”
本文就两个例子跟大家分享一下background-image与background-size的渐变(transition)所带来的方便与“深坑” 首选,说说这东西好的地方,有时候在做PC项目的时候,可 ...
- [大牛翻译系列]Hadoop(12)MapReduce 性能调优:诊断硬件性能瓶颈
6.2.5 硬件性能问题 尽管单独的硬件的MTTF(平均失效前时间)都数以年记,然而在集群中就完全不是这么一回事了.整个集群的MTTF就要小得多.这一节要介绍如何确定CPU,内存,磁盘和网络是否过度利 ...
- php实现图片加密解密,支持加盐
一个简单的图片加解密函数 使用client跑,不要使用浏览器跑 qq845875470 ,技术交流 <?php /** * Created by hello. * User: qq 845875 ...
- DataSnap中连接池的应用
当开发人员开始创建Delphi的DataSnap应用时很常见的数据库连接定义方式是每个数据模块建立一个连接.这样做将产生大量的数据库连接,并产生很多问题.从Delphi XE开始,EMB提供了Sess ...
- SQLServer处理亿万级别的数据的优化措施
如何在SQLServer中处理亿万级别的数据(历史数据),可以按以下方面进行: 去掉表的所有索引 用SqlBulkCopy进行插入 分表或者分区,减少每个表的数据总量 在某个表完全写完之后再建立索引 ...
- [转]bat中的特殊字符,以及需要在bat中当做字符如何处理
bat中的特殊字符,以及需要在bat中当做字符如何处理 批处理.Bat 中特殊符号的实际作用,Windows 批处理中特殊符号的作用: @ \\隐藏命令的回显. ~ \\在for中表示使用增强的变量扩 ...
- Ubuntu14.04下中山大学锐捷上网设置
Ubuntu14.04下中山大学锐捷上网设置 打开终端后的初始目录是 -,Ubuntu安装完毕默认路径,不是的请自行先运行cd ~ 非斜体字命令行方法,斜体字是图形管理方法,二选一即可 记得善用Tab ...
- myeclipse ctrl+shift+F失效
因为在使用搜狗输入法,切换到英文状态,输入ctrl+shift+F,格式化完之后,然后再换回来