![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
平衡树
沙雕.
此人很帅,什么都没有写
展开
-
HDU 3436 Queue-jumpers (无旋treap)
题目传送门(HDU3436)解题思路题目的意思是位于一个[1,n]的序列有三种操作,操作一把一个数放到队首,操作二询问某个数现在的位置,操作三询问现在排名为k的数是谁Part I 口胡(第一部分可以跳过)一开始的愚蠢思路是这样的:用一棵平衡树T1维护进行过top操作的数的序列,另一棵平衡树T2维护top操作过的数的值排序①每次top,如果这个数在T1中,找出他的排名,然...原创 2019-11-09 20:26:33 · 185 阅读 · 0 评论 -
HDU 1890 Robotic Sort(无旋treap)
题目传送门(HDU1890)解题思路题目大意是[1,n]整个区间询问最小的数的位置x,然后[1,x]整段区间翻转,之后最小的数被放到1位置,之后对于[2,n]区间重复同样的操作,每次都让你输出当前区间内最小的数的位置。单纯的寻找区间最小值,线段树之类的直接实现以下就可以了。单纯的区间翻转,随便搞个支持区间操作的平衡树打个标记就可以了。现在两个操作合并在一起的话,该怎...原创 2019-11-09 19:35:29 · 226 阅读 · 0 评论 -
POJ 2828 Buy Tickets(无旋treap)
题目传送门解题思路题目大意是把一个数插到当前数列的某一位后面,问最后这个数列是啥样的据说还可以用树状数组/线段树做,咱也不想看,咱也不想学。无旋treap的做法非常的直接,基本上会无旋treap这题也能直接写了,所以直接看代码吧。代码#include<cstdio>#include<algorithm>using namespace std;...原创 2019-11-09 19:10:28 · 120 阅读 · 0 评论 -
P3391 【模板】文艺平衡树 (无旋treap)
题目传送门解题思路用可以提取区间的平衡树,对区间整体打标记,先不下放,等到操作涉及这个节点时再下放:交换左右儿子并给左右儿子打标记我用的是无旋treap刚开始需要建树,建树模仿笛卡尔树,由于所有元素出栈之后自身的儿子不会再有变化,因此出栈的时候再push_up即可,由于栈维护右链,栈顶就是root要看Splay版本的也可以去这里看>>>Splay版本文艺平衡树...原创 2019-11-09 19:01:11 · 103 阅读 · 0 评论 -
POJ 3481 Double Queue(无旋treap/Splay)
题目传送门解题思路三种操作,插入一个数,取最大值并删除,取最小值并删除。应该有挺多方法可以做的。提供无旋treap和Splay这两种平衡树的数组的做法。代码无旋treap版本#include<cstdio>#include<algorithm>using namespace std;#define ll long long#defi...原创 2019-11-09 18:52:56 · 286 阅读 · 0 评论 -
Splay/伸展树(P3369 P3391 P2042)
什么是splay?一种平衡二叉树。什么是平衡二叉树?需要先了解什么是:二叉搜索树——简称BST,每个节点最多有两个子节点,左子比当前节点小,右子比当前节点大。因此对于插入和查找第k小的值,都可以从根递归着进行下去,在到达递归终点之前,不是选择这个节点左儿子就是右儿子,因此,操作的复杂度 = 树的深度。然而,这棵树的形状会因为你插入数字的顺序和大小不同,导致层数过大。比如你插...原创 2019-10-28 20:40:39 · 543 阅读 · 0 评论 -
后缀平衡树模板(例题SPOJ - DISUBSTR)
删除操作还没有验证,原本例题是HYSBZ5084,不过网站好像炸了,一直没法提交,目前不知道删除代码正确性,不过插入和维护height都已经验证过意思就是你可能会被这篇文章演平衡树用treap写的什么是后缀平衡树?利用平衡树动态维护后缀数组。可以支持的操作为加入一个字符到串末尾或者删除末尾一个字符。先搞清两个问题:只能在末尾操作吗?中间插入删除会影响多个后缀,末尾插...原创 2019-09-30 20:47:08 · 157 阅读 · 0 评论 -
可持久化无旋treap(良心讲解 P3835)
前置技能:无旋treap什么是可持久化平衡树?每经过一次操作,当前状态的整棵树就成为一棵全新版本的树,给每个版本编个号,我们可以根据版本号查找这格版本的树中的一些信息,也可以在这个版本上进行修改生成全新版本。我们需要保留每个版本的所有信息。可持久化无旋treap的大体思想由于treap的树的期望深度为O(logn)级别,所以每次操作(插入/删除等)只涉及O(logn)个节点的修...原创 2019-09-23 21:26:18 · 314 阅读 · 0 评论 -
BZOJ 1500 [NOI2005]维修数列 (无旋treap良心题解)
题目传送门上面链接沉了幸亏洛谷还有这道题无旋treap解题的原理:1.无旋treap可以在维护平衡的同时保持中序遍历不变(treap也可以,应该都可以),因此我们用下标代表插入二叉树的值,那么我们可以按照中序遍历获得原来的数组。2.无旋treap的分裂操作可以分裂出包含前k个节点的树和剩下元素的树,就相当于可以把数组切开。你可以切取想要的区间进行操作,操作完再merge回去即可...原创 2019-09-10 20:14:22 · 204 阅读 · 1 评论 -
无旋treap/fhq-treap 模板 (附良心讲解 + 例题:洛谷P3369 普通平衡树)
博文更新:20190917 更新了一下merge和split函数的递归理解定义:无旋treap,就是不通过旋转的维护堆性质的treap,根本的原理还是 tree + heap。与普通treap的不同之处:大概就是可以可持久化。然后区间操作的话,不知道有旋的行不行,用无旋的反正是比较好搞,区间操作举个例子就是让你把一段区间的数反过来等等。现在听着可能区间操作什么的可能莫名...原创 2019-09-09 22:57:45 · 669 阅读 · 0 评论 -
HDU 1506 Largest Rectangle in a Histogram(笛卡尔树)
题目传送门解题思路:来来来,笛卡尔树了解一下代码1:(非要用结构体版)#include<bits/stdc++.h>using namespace std;#define ll long long#define for1(i,a,b) for (int i=a;i<=b;i++)#define for0(i,a,b) for (int i=a;i&l...原创 2019-09-07 21:28:51 · 158 阅读 · 0 评论 -
笛卡尔树模板
如果学过treap(一种平衡二叉树),笛卡尔树应该很好理解本文只介绍基础的建树,没有深入的东西。(你懂我意思吧)笛卡尔树也是二叉树+堆一、二叉树与堆的概念可以看看我这篇,顺便把treap学了也可以,简单哒二、笛卡尔树的结构笛卡尔树可以按顺序插入一个数组,我们将下标当值插入二叉树,然后数组的值作为“优先级”,维护堆的性质。盗一份网上的图你们参考一下,结构就是这个样子...原创 2019-09-07 21:27:47 · 288 阅读 · 0 评论 -
POJ 1442 Black Box(Treap模板题)
题目链接:http://poj.org/problem?id=1442题目大意:就讲一下第二行数列到底是什么玩意儿吧,第二行的意思是插入第几个数的时候进行一次询问,第一次询问排第一,第二次询问排第二的...解题思路:Treap模板题,所以我另写了一篇博客把这题需要的部分讲了一下:对,对,就是这里代码:#include<cstdio>#include<c...原创 2019-08-30 20:17:52 · 187 阅读 · 0 评论