数据结构之Treap】的更多相关文章

1. 概述 同splay tree一样,treap也是一个平衡二叉树,不过Treap会记录一个额外的数据,即优先级.Treap在以关键码构成二叉搜索树的同时,还按优先级来满足堆的性质.因而,Treap=tree+heap.这里需要注意的是,Treap并不是二叉堆,二叉堆必须是完全二叉树,而Treap可以并不一定是. 2. Treap基本操作 为了使Treap 中的节点同时满足BST性质和最小堆性质,不可避免地要对其结构进行调整,调整方式被称为旋转.在维护Treap 的过程中,只有两种旋转,分别是…
关于重量平衡树的相关概念可以参考姊妹文章:重量平衡树之替罪羊树 Treap是依靠旋转来维护平衡的重量平衡树中最为好写的一中,因为它的旋转不是LL就是RR 对于每一个新的节点,它给这个节点分配了一个随机数,用作优先级,然后以这个优先级来维护一个堆结构 由于堆本身就是完全二叉树结构,这样维护之后的树就无限接近于完全二叉树,所以还是很神奇的 这棵树满足BST的一切性质,除了不能处理序列问题之外已经无敌了 应该说,抛去动态树问题之外,这是实战最好用的树了 我们还是先看定义: struct Tree {…
之前我们讲到二叉搜索树,从二叉搜索树到2-3树到红黑树到B-树. 二叉搜索树的主要问题就是其结构与数据相关,树的深度可能会非常大,Treap树就是一种解决二叉搜索树可能深度过大的还有一种数据结构. Treap Treap=Tree+Heap. Treap本身是一棵二叉搜索树,它的左子树和右子树也各自是一个Treap.和一般的二叉搜索树不同的是.Treap纪录一个额外的数据,就是优先级.Treap在以关键码构成二叉搜索树的同一时候,还满足堆的性质.这些优先级是是在结点插入时,随机赋予的.Treap…
平衡树 平衡树就是一种可以在log的时间复杂度内完成数据的插入,删除,查找第k大,查询排名,查询前驱后继以及其他许多操作的数据结构. Treap treap是一种比较好写,常数比较小,可以实现平衡树基本操作的一种平衡树.treap的平衡是基于随机化.是将堆与二叉查找树结合起来所得到的数据结构. treap在插入数时,给每个数赋了一个新的随机的值id.在以后的操作中,必须始终使得treap中的id构成一个堆的形态才可以.这样就达到了平衡的目的. 定义 struct node { int ch[2]…
董的博客:数据机构与算法合集 背包问题应用(2011-08-26) 数据结构之红黑树(2011-08-20) 素数判定算法(2011-06-26) 算法之图搜索算法(一)(2011-06-22) 算法之排列与组合算法(2011-06-21) 数据结构之位图(2011-05-22) 数据结构之AVL树(2011-05-09) 算法之排序算法(2011-05-05) 数据结构之Treap(2011-05-03) 数据结构之堆(2011-04-28) 数据结构之后缀数组(2011-04-27) 数据结…
想了很久,才开始动笔. 怎么说,感觉挺对不起自己的.愚蠢的失误让我正好卡着一等线,真希望不要是二等奖. 最难过的是,努力全葬送在愚蠢上面了. 不过也好,学会平静自己也是一种能力. 半期考试也遭的一塌糊涂,我有开始想要不要退竞赛了. 还有省选,加油吧. 要好好刷题了. 附上到四月份的计划: 学会一些算法: 数据结构:Treap,splay,sbt,主席树,划分树,zkw线段树 图论:仙人掌(向ysy学习),网络流,差分约束,A*, 树论:点分治,树链剖分 字符串:ac自动机,后缀数组 数学:高斯消…
终于又到写酱油记的时间了...不过开心不起来诶.. Day 0 晚上睡不着觉也不造为啥... 起来看了一本亚里亚小说,继续睡,睡不着... 又起来看了一本亚里亚小说,继续睡,睡不着... 然后...死循环了... Day 1 折腾到早上四点才睡着...亚里亚小说都要看完了...早上六点就起来赶第一班高铁去北京 这尼玛...京沪高铁的列车上没有插头...还好我电脑续航能力久...随手找了三道题在车上写掉,然后..补觉补觉! 下午到了人大(旁的燕山宾馆的公寓楼)...这这这...说好的四星级呢...…
Preface 这篇博客记录的是我联赛前虽然只有两天了的打板子记录. 只求真的能给我起到些作用吧,一般按照难度排序. 而且从这篇博客开始我会用H3的标题代替H4 为了节约篇幅,以下的代码一般均以class的形式给出,模板题均来自Luogu. 快读快输(文件操作) 这是基础中的基础吧,这个感觉敲出来还是没什么问题的(默认不读/输负数) class FileInputOutput { private: #define S 1<<21 #define tc() (A==B&&(B=(…
[写在前面的话] 如果想学Treap,请先了解BST和BST的旋转 二叉搜索树(BST)(百度百科):[here] 英文好的读者可以戳这里(维基百科) 自己的博客:关于旋转(很水,顶多就算是了解怎么旋转,建议自行上百度)[here] Treap(= binary search Tree + Heap),中文通常译作树堆,为每个节点附加一个优先值,让优先值满足堆的性质,防止BST退化成一条链. 目录 节点定义 旋转操作 插入操作 查找操作 删除操作 其他操作 完整代码 其它内容 [节点定义] 每个…
有可能当树中有键值相同的节点时,貌似是要对Split和Merge均进行复制的,本人实测:只在Split的时候复制得到了一个WA,但只在Merge的时候复制还是AC,可能是恰好又躲过去了.有人说假如确保键值唯一,或者在一个节点保存相同键值的多个点的实现,则只需要在其中一个进行复制,因为从根到达叶子的路径是唯一的,但假如有多个点,分裂操作把这些权值相同的点分成两部分,而在插入/删除节点之后有可能会使得一棵树的形态改变(基于随机优先级),这些权值相同的点未必是Split时复制出来的那几个.暂时没有想明…
FHQ Treap是什么? FHQ Treap,又名无旋Treap,是一种不需要旋转的平衡树,是范浩强基于Treap发明的.FHQ Treap具有代码短,易理解,速度快的优点.(当然跟红黑树比一下就是--)至少它在OI中算是很优秀的数据结构了. 前置知识: C++ 二叉搜索树的基本性质,下面会讲 二叉堆 二叉搜索树的基本性质 很简单,就这几个. 在二叉搜索树中,每个结点都满足左子树的结点的值都小于等于自己的值,右子树的结点的值都大于自己的值,左右子树也是二叉搜索树. 中序遍历二叉搜索树可以得到一…
最近在研究平衡树,看起来这种东西又丧水又很深,感觉很难搞清楚.在Ditoly学长的建议下,我先学习了正常的treap,个人感觉这应该是平衡树当中比较好懂的而且比较好写的一种. 然而,发现带旋treap有很多无法支持的操作,例如各种区间操作,而且由于会旋转无法可持久化,这是一个十分影响实用性的问题,在没有办法支持区间操作的情况下,我有2种选择: 1)滚去学splay:2)学习无旋treap 正常人应该都会去学习splay,然而我选择了后者,因为貌似splay在FJ省选R2T1中被卡成傻逼了....…
首先说一下, 这个东西可以搞一切bst,treap,splay所能搞的东西 pre 今天心血来潮, 想搞一搞平衡树, 先百度了一下平衡树,发现正宗的平衡树写法应该是在二叉查找树的基础上加什么左左左右右左右右的旋转之类的, 思路比较好理解,但是 代码量........ 一看就头大,, 然后,在洛谷翻题解的时候无意间看到了远航之曲发的一篇非常短小精悍的题解, 于是就学了一下 FHQ Treap 这个东西的学名应该是叫做fhq treap,应该是treap的强化版. 整个数据结构中只有两个操作: 1.…
之前写treap的传送门 之前写的那个太毒瘤了,这次放一个更毒瘤的指针版上来 #include<cstdio> #include<iostream> #define rg register #define ci const int #define cl const long long typedef long long int ll; typedef unsigned int uit; template <typename T> inline void qr(T &am…
今天上午学了一下fhq treap感觉真的很好用啊qwq 变量名解释: \(size[i]\)表示以该节点为根的子树大小 \(fix[i]\)表示随机权值 \(val[i]\)表示该节点的值 \(ch[i][0]\)表示该节点的左儿子 \(ch[i][1]\)表示该节点的右儿子 更新操作:update inline void update(int x) {size[x]=1+size[ch[x][0]]+size[ch[x][1]];} 就是用自己的左右子树更新自己. 新建节点:new_node…
[Treap] [Treap浅析] Treap作为二叉排序树处理算法之一,首先得清楚二叉排序树是什么.对于一棵树的任意一节点,若该节点的左子树的所有节点的关键字都小于该节点的关键字,且该节点的右子树的所有节点的关键字都大于该节点的关键字,则这棵树是一棵二叉排序树. Treap在每一个节点中有两个最关键的元素——weight和value. value是在创建这个新节点时赋予该节点的数值大小,Treap利用每个节点的value值将整棵树维持成一个二叉排序树. weight是在创建这个新节点时赋予该节…
还有人把Treap叫做树堆的,但是常用名还是叫做Treap的比较多. 不进行任何封装的,带求和操作的,一个节点存放多个元素的最普通的Treap. #include<bits/stdc++.h> using namespace std; typedef long long ll; #define ls ch[id][0] #define rs ch[id][1] const int INF = 1e9; const int MAXN = 1000000 + 5; int ch[MAXN][2],…
1.BST二叉搜索树 顾名思义,它是一棵二叉树. 它满足一个性质:每一个节点的权值大于它的左儿子,小于它的右儿子. 当然不只上面那两种树的结构. 那么根据性质,可以得到该节点左子树里的所有值都比它小,右子树的都比它大. 而平衡树都是基于BST的. 为什么叫做平衡树?对于数的操作可能会破坏BST的性质,这时会进行另外的操作,保持它的性质. 为什么要用BST?对于一棵BST,每一次的操作,都相当于进行一次二分,时间复杂度可以降到log级别. 这里写的是两个常用的平衡树. 2.Splay splay树…
http://www.cnblogs.com/SymenYang/p/3576726.html…
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 9046  Solved: 3840[Submit][Status][Discuss] Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数,因输出最小的排名)4. 查询排名为x的数5. 求x的前驱(前驱定义为小…
题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删除一个) 查询x数的排名(若有多个相同的数,因输出最小的排名) 查询排名为x的数 求x的前驱(前驱定义为小于x,且最大的数) 求x的后继(后继定义为大于x,且最小的数) 输入输出格式 输入格式: 第一行为n,表示操作的个数,下面n行每行有两个数opt和x,opt表示操作的序号(1<=opt<=6) 输出格式: 对于操作3,4,5,6每行输出一个数,表示对应答案 输…
#1325 : 平衡树·Treap 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说的是哪两个啊? 小Ho:就是二叉排序树和堆啊,你看这两种数据结构都是构造了一个二叉树,一个节点有一个父亲和两个儿子. 如果用1..n的数组来存储的话,对于二叉树上的一个编号为k的节点,其父亲节点刚好是k/2.并且它的两个儿子节点分别为k*2和k*2+1,计算起来非常方便呢. 小Hi:没错,但是小Hi你知道有一种办…
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 7390  Solved: 3122 [Submit][Status][Discuss] Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 1. 插入x数 2. 删除x数(若有多个相同的数,因只删除一个) 3. 查询x数的排名(若有多个相同的数,因输出最小的排名) 4. 查询排名为x的数 5. 求x的前驱…
http://www.lydsy.com/JudgeOnline/problem.php?id=1862 http://www.lydsy.com/JudgeOnline/problem.php?id=1056 这两题一模一样啊.... 首先这是一道十分恶心的数据结构题. 一定要注意: 首先平衡树内关键字是重复的,那么我们需要用第二关键字来确认位置,即插入时间. 那么就一定要弄清楚顺序. !!! 因为这个插入顺序和排名有关 所以插入顺序一定要遵循堆的性质 在本题里,插入顺序是左小右大,和平衡树一…
WZJ的数据结构(负三十二) 难度级别:D: 运行时间限制:5000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给你一棵N个点的无根树,边上均有权值,每个点上有一盏灯,初始均亮着.请你设计一个数据结构,回答M次操作. 1 x:将节点x上的灯拉一次,即亮变灭,灭变亮. 2 x k:询问当前所有亮灯的节点中距离x第k小的距离(注意如果x亮着也算入). 输入 第一行为一个正整数N.第二行到第N行每行三个正整数ui,vi,wi.表示一条树边从ui到vi,距离为wi…
WZJ的数据结构(负十四) 难度级别:D: 运行时间限制:6000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 请你设计一个数据结构,完成以下功能: 给定一个大小为N的整数组A,M次操作,操作分两种: 1.1 i j k 每次询问给你i,j,k三个参数,求Ai至Aj中第k小的数. 2.0 x v 每次操作给你x,v两个参数,将A[x]改成v. 输入 第一行为两个正整数N,M.第二行为N个正整数Ai.接下来M行为操作. 输出 对于每个询问输出答案(保证k合法)…
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4156 题目拷贝难度大我就不复制了. 题目大意:维护一个字符串,要求支持插入.删除操作,还有输出第 i 次操作后的某个子串.强制在线. 思路1:使用可持久化treap可破,详细可见CLJ的<可持久化数据结构的研究>. 思路2:rope大法好,详见:http…
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=3196 可以处理区间问题的平衡树. 3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2412  Solved: 986[Submit][Status][Discuss] Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名…
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=3224 Treap模板题.支持如下几种操作: 1.插入; 2.删除; 3.rank(x); 4.kth(k); 5.pre(x); 6.suc(x); 3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 7395  Solved: 3124[Submit][Status][Discuss] Descript…
题目整理 Challenge 0  随机线性存储表-easy Challenge 1  链表数组-easy Challenge 2  可持久化Treap的可持久化运用-hard Challenge 3  线段树-easy Challenge 4  线段树-medium Challenge 5  线段树加lazy标记-medium Challenge 6  分块-hard Challenge 7  离散化或stl_map-easy Challenge 8  平衡树-easy Challenge 9…