[模板] Treap】的更多相关文章

不得不说平衡树博大精深,除了Treap,还有splay,非旋Treap和可持久化数据结构,今天先讲讲Treap,也很感谢这位大佬的博客给予我帮助:http://www.360doc.com/content/19/0120/11/5315_810146183.shtml Treap的核心就是Tree+Heap,即在二叉搜索树的基础上根据随机数生成的优先级使树保持堆的性质,从而实现使Treap的深度不会太大的效果 核心操作就是旋转:人工YY一下……发现旋转有左旋(Zag)和右旋(Zig)两种操作,旋…
插入x 删除x 查询排名为x的数 查询x的排名 求x的前驱.后继 //Stay foolish,stay hungry,stay young,stay simple #include<iostream> #include<cstdio> #include<cstdlib> #include<cctype> using namespace std; const int MAXN=100010; const int INF=1<<29; int rd…
#include<iostream> #include<cstdio> #include<cstdlib> #define INF 0x7fffffff using namespace std ; struct treap { int l,r,val,dat,cnt,size; #define l(x) tr[x].l #define r(x) tr[x].r #define val(x) tr[x].val #define dat(x) tr[x].dat #defi…
Treap 是一种通过赋予结点随机权值的一种满足堆性质的二叉搜索树,它很好的解决了二叉搜索树顺序插入组成链式的局限性. 名次树是指在treap的每个结点中添加附加域size,表示以它为根的子树的总结点树. 名次树支持两个操作:Kth(x): 找出第k小(第k大)的元素. Rank(x): 值x的名次,即比x小(大)的结点个数加 1 . 以第k大为例,代码如下: struct Node { Node *ch[]; int r; //随机权值 int v; //值 int s; //附加域size…
题意 维护一些数,其中需要提供以下操作: 1.插入\(x\) 2.删除\(x\)(若有多个相同的数,只删除一个) 3.查询\(x\)的排名(排名定义为比当前数小的数的个数\(+1\)) 4.查询排名为\(x\)的数 5.求最大的小于\(x\)数 6.求最小的大于\(x\)数 \(n \leq 100000\) 思路 这是一道\(treap\)模板 \(Treap=tree+heap\) 下图是一棵二叉排序树 性质:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值:若它的右子树不空,则…
///treap树模板 typedef struct Node ///节点的结构体 { Node *l,*r; int val,pri; ///节点的值和优先级 int sz; ///节点子树的节点数 Node(int x) ///初始化节点 { l=r=NULL; val=x; pri=rand(); sz=; } }Node; Node *root; int Tsize(Node *T) ///计算子树的叶子节点 { ; return T->sz; } Node *L_rotate(Node…
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的前驱…
Treap树 核心是 利用随机数的二叉排序树的各种操作复杂度平均为O(lgn) Treap模板: #include <cstdio> #include <cstring> #include <ctime> #include <iostream> #include <algorithm> #include <cstdlib> #include <cmath> #include <utility> #include…
这是我综合poj1442 3481 2352的treap操作 得到treap完全版模板.(经测AC) 结构体Tree { int key; //键值 int size; //该子树总节点个数 int pri; //其随机值 int son[2]; //从nocow一份代码中学来的,0表示左儿子,1表示右儿子,旋转只需一个函数即可 (int num;) //该节点在序列中的原位置,可添加 } 该Treap模板支持操作: 1. 插入值 2. 删除值 3. 找出第p小的节点的编号(找最大只需find(…
原理可以看hihocoder上面的讲解,很清楚,不多说了. 模板抄lrj训练指南上面的. /** Treap 实现 名次树 功能: 1.找到排名为k的元素 2.值为x的元素的名次 初始化:Node* root = NULL; */ #include <cstdlib> #include <cstdio> #include <cstring> #include <vector> using namespace std; struct Node { Node *…