[补档][HZOI 2016]简单的Treap

时间:2022-09-06 22:22:56

[HZOI 2016]简单的Treap

题目

Treap是一种平衡二叉搜索树,除二叉搜索树的基本性质外,Treap还满足一个性质:
每个节点都有一个确定的优先级,且每个节点的优先级都比它的两个儿子小(即它的优先级满足堆性质)。
不难证明在节点的优先级都事先给定且互不相同时,对应的Treap有且仅有一个。
现在,给定n个数和每个数对应的优先级,求出对应的以数的大小作为二叉搜索树比较依据的Treap的先序遍历结果。
对先序遍历的定义是:先访问根节点,再访问左子树,最后访问右子树。

INPUT

第一行一个数n表示数的个数。
第二行n个数表示每个数的大小。
第三行n个数表示每个数对应的优先级。

OUTPUT

一行n个数,表示Treap的先序遍历结果(对于每个节点,输出对应的数)。

SAMPLE

INPUT

7
2 11 5 9 1 4 3
2 10 1 8 4 6 5

OUTPUT

5 2 1 3 4 9 11

解题报告

不要相信题目名称!!!
这题卡Treap,用Treap会T掉俩点,那么我们就需要黑科技——笛卡尔树来解决问题了。

笛卡尔树

笛卡尔树是一种同时满足二叉搜索树和堆的性质的数据结构。 可在一个数组上构造出来(时间复杂度可以达到O(n))。树中节点有几个属性, key(节点元素的大小)、index(节点在原数组中的索引)、left(左子节点)、right(右子节点)、parent(父节点)。

性质

树中的元素满足二叉搜索树性质,要求按照中序遍历得到的序列为原数组序列
树中节点满足堆性质,节点的key值要大于其左右子节点的key值

构造

要求在给定的数组的基础上构造一棵笛卡尔树,这可以在O(n)的时间内完成。 其具体思路为:
当按照index从1到n(或者从0到n-1)的顺序将数组中的每个元素插入到笛卡尔树中时,当前要被插入的元素的index值最大,因此根据二叉搜索的性质需要沿着当前已经完成的笛卡尔树的根的右子树链搜索。
由于笛卡尔树要满足堆的性质(以最大堆为例),父节点的key值要大于子节点的key值,所以沿着树根的右子树链往下走,直到搜索到的节点的key值小于等于当前要插入节点的key值。
此时,便找到了当前结点需要插入的位置,记为P。此时P下方的节点的key值肯定小于当前被插入节点的key,但是index也小于当前插入节点的index(即需要在二叉搜索树中当前结点之前的位置),所以将当前节点插入到P的位置,同时将以P为根的子树挂载到新插入的节点的左子树(为了保证P及其子树在新插入节点之前被二叉搜索)。
实际实现的时候,可以采用栈的数据结构。栈中保存当前树中的从树根开始的右子节点链,根在栈底部。
插入新元素的时候,从树的右子链的最末尾从下往上查找,直到找到第一个满足堆性质的节点(即找到的节点的key值大于当前需要插入的节点)。用栈来实现就是从栈顶不断弹出元素,直到栈顶的元素的key大于当前结点的key,然后将该节点入栈,同时将最后被弹出的节点的parent指向该节点,以及该节点的左子节点指向最后被弹出的节点。
复杂度分析: 每个节点最多入栈一次,出栈一次,因此时间复杂度为 O(n)
ps:其实没那么麻烦= =,几个数组乱抡就可以了
那么剩下的就很简单了,按关键字排个序,建树,然后乱搞- -

[补档][HZOI 2016]简单的Treap的更多相关文章

  1. COGS 2421.[HZOI 2016]简单的Treap 题解

    题目大意: 给定n个数及其优先级,求对应的符合最小堆性质的Treap的先序遍历. n<=500000. 解法: 目前为止我只想到了三种解法,其中第三种是正解. 1.暴力1 以优先级为关键字排序, ...

  2. COGS2421 &lbrack;HZOI 2016&rsqb;简单的Treap

    题面见这里 大概是个模板题 Treap暴力插入的做法太暴力了并不优美 这里就需要用到笛卡尔树的构造方法,定义见这里 在 假的O(n) 的时间内构造一棵Treap 把元素从小到大排序 这样从小到大插入时 ...

  3. &lbrack;COGS 2421&rsqb; &lbrack;HZOI 2016&rsqb; 简单的Treap 笛卡尔树

    笛卡尔树就是你给两维限制,一维堆R,一维二叉搜索树K,平地拔起一棵Treap,最广范的应用:用LCA求区间最值,建Treap,还有个什么范围top k我表示并不会查都查不到.它最妙最高的地方在于用栈来 ...

  4. cogs——2478&period; &lbrack;HZOI 2016&rsqb;简单的最近公共祖先

    2478. [HZOI 2016]简单的最近公共祖先 ★☆   输入文件:easy_LCA.in   输出文件:easy_LCA.out   简单对比时间限制:2 s   内存限制:128 MB [题 ...

  5. cogs 2478&period; &lbrack;HZOI 2016&rsqb;简单的最近公共祖先

    2478. [HZOI 2016]简单的最近公共祖先 ★☆   输入文件:easy_LCA.in   输出文件:easy_LCA.out   简单对比时间限制:2 s   内存限制:128 MB [题 ...

  6. COGS——T 2478&period; &lbrack;HZOI 2016&rsqb;简单的最近公共祖先

    http://www.cogs.pro/cogs/problem/problem.php?pid=2478 ★☆   输入文件:easy_LCA.in   输出文件:easy_LCA.out   简单 ...

  7. COGS 2199&period; &lbrack;HZOI 2016&rsqb; 活动投票

    2199. [HZOI 2016] 活动投票 ★★   输入文件:hztp.in   输出文件:hztp.out   简单对比时间限制:0.5 s   内存限制:2 MB [题目描述] 衡中活动很多, ...

  8. COGS 2485&period; &lbrack;HZOI 2016&rsqb;从零开始的序列

    2485. [HZOI 2016]从零开始的序列 ★★   输入文件:sky_seq.in   输出文件:sky_seq.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] ...

  9. cogs——2419&period; &lbrack;HZOI 2016&rsqb;公路修建2

    2419. [HZOI 2016]公路修建2 ★☆   输入文件:hzoi_road2.in   输出文件:hzoi_road2.out   简单对比时间限制:1 s   内存限制:128 MB [题 ...

随机推荐

  1. 如何解决ajax重复提交的问题

    如下一段代码: 先忽略我没引jquery.js的问题,这是一个案例. 当我们点击提交时,控制台输出两次e,在network里查看,可以看到我们的ajax传输了两次,造成了数据重复提交. 一种解释为bu ...

  2. Input钱币规范化

    要求限制input的输入内容,只有输入0-9的数字,backspace,delete,小数点,还有左右移动有效,reFormat函数用于input得到光标时将带逗号的金钱格式转化为没有逗号的字符串,a ...

  3. c语言中细节注意(初级)

    /* 编写如下函数,不使用下标运算符,返回字符串str中字符c的个数 (若不存在则为0). */ #include <stdio.h> int str_chnum(const char * ...

  4. OpenCV局部变形算法探究

    OpenCV是跨平台的强大的计算机视觉识别和图像处理的开源库,可以利用他来实现:模式识别.构建神经网络.深度学习,总之用途多多,入门级就先做一下图像处理吧! 基本的图像处理算法(图像灰阶化.二值化.仿 ...

  5. Struts2的知识点小总结

    strust2是 struts1和webwork的结合  (本质相当于servlet) 核心:拦截器 interceptor  action ognl和valuestack 使用struts的准备工作 ...

  6. centos7&period;3 kubernetes&sol;k8s 1&period;10 离线安装 --已验证

    本文介绍在centos7.3使用kubeadm快速离线安装kubernetes 1.10. 采用单master,单node(可以多node),占用资源较少,方便在笔记本或学习环境快速部署,不适用于生产 ...

  7. 信息技术手册可视化进度报告 基于jieba的关键字提取技术

    在这一篇博客之前,我已经将word文件中的内容通过爬虫的方式整理到数据库中了,但是为了前台展示的需要,还必须提取出关键字,用于检索. 我用的是jieba分词,GitHub地址:https://gith ...

  8. JAVA记录-POST与GET方式区别

    1.get是从服务器上获取数据的一种请求,post是向服务器提交数据的一种请求. 2.get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到 ...

  9. 日常推荐大神操作,如何再oracle中delete数据后恢复

    http://blog.csdn.net/wangdinghai365/article/details/8593869

  10. 不到 200 行代码,教你如何用 Keras 搭建生成对抗网络(GAN)【转】

    本文转载自:https://www.leiphone.com/news/201703/Y5vnDSV9uIJIQzQm.html 生成对抗网络(Generative Adversarial Netwo ...