#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;
struct Node{
Node *ch[2];
int rank , value , size;
const static int mod = 100;
Node(int x){
value = x;
rank = rand();
ch[1] = ch[0] = NULL;
size = 0;
}
bool operator < (int & rht) const{
return value < rht;
}
bool operator == (int & rht) const{
return value == rht;
}
};
class Treap{
private:
static int insert(Node * &o,int x);
static void rotate(Node * &o,int d);
static int remove(Node * &o, int x);
static int find(Node * &o, int x); static void show(Node * o);
static void destory(Node * &o);
public:
Node * root ;
Treap(){
root = NULL;
}
~Treap(){
Treap :: destory(root);
}
int insert(int x){
return Treap :: insert(root,x);
}
int remove(int x){
return Treap :: remove(root,x);
}
int find(int x){
return Treap :: find(root,x);
}
void show(){
Treap :: show(root);
};
};
int Treap :: insert(Node * &o , int x){
if(o == NULL){
o = new Node(x);
return 1;
}
if(o -> value == x) {
(o -> size) ++;
return o -> size;
}
int guide = ( *o < x ) ? 1 : 0 ;
Treap ::insert(o-> ch[guide], x);
if(o->ch[guide] -> rank > o -> rank ) {
Treap::rotate(o,guide^1);
}
}
int Treap :: remove(Node * &o , int x){
if( o == NULL ) return 0;
if(o -> value == x){
( o -> size ) -- ;
if( o -> size != 0) return 1;
// 需要删除
Node * del = o;
if(o->ch[0] && o->ch[1]){
int tmp = o->ch[0] -> rank < o->ch[1] -> rank ? 0 : 1;
Treap :: rotate( o , tmp);
return Treap :: remove(o->ch[tmp],x);
}else{
// 即使没有儿子节点也无所谓,因为会吧NULL配上;
if( o-> ch[0] ) o = o -> ch[0];
else o = o -> ch[1];
delete del;
return 1;
}
}
int guide = ( *o < x )? 1 : 0 ;
Treap :: remove(o->ch[guide], x);
}
int Treap :: find(Node * &o , int x){
if( o == NULL ) return 0;
if( o -> value == x)
return o -> size;
int guide = ( *o < x )? 1 : 0;
return Treap :: find(o->ch[guide] , x);
}
void Treap :: rotate(Node * &o , int d){
Node * tmp = o -> ch[d^1];
o -> ch[d^1] = tmp -> ch[d];
tmp -> ch[d] = o;
o = tmp;
}
void Treap :: show(Node * o){
if( o == NULL ) return;
printf("(");
show(o->ch[0]);
printf("%d/%d",o -> value, o->rank);
show(o->ch[1]);
printf(")");
}
void Treap :: destory(Node * & o){
if( o == NULL) return;
if( o-> ch[0]) Treap :: destory(o->ch[0]);
if( o-> ch[1]) Treap :: destory(o->ch[1]);
delete o;
o = NULL;
}
int main(){}

  

treap-名次树-树堆的更多相关文章

  1. 平衡树及笛卡尔树讲解(旋转treap,非旋转treap,splay,替罪羊树及可持久化)

    在刷了许多道平衡树的题之后,对平衡树有了较为深入的理解,在这里和大家分享一下,希望对大家学习平衡树能有帮助. 平衡树有好多种,比如treap,splay,红黑树,STL中的set.在这里只介绍几种常用 ...

  2. JavaScript 数据结构与算法之美 - 非线性表中的树、堆是干嘛用的 ?其数据结构是怎样的 ?

    1. 前言 想学好前端,先练好内功,内功不行,就算招式练的再花哨,终究成不了高手. 非线性表(树.堆),可以说是前端程序员的内功,要知其然,知其所以然. 笔者写的 JavaScript 数据结构与算法 ...

  3. CF487E Tourists 【圆方树 + 树剖 + 堆】

    题目链接 CF487E 题解 圆方树 + 树剖 裸题 建好圆方树维护路径上最小值即可 方点的值为其儿子的最小值,这个用堆维护 为什么只维护儿子?因为这样修改点的时候就只需要修改其父亲的堆 这样充分利用 ...

  4. 【bzoj4016】[FJOI2014]最短路径树问题 堆优化Dijkstra+DFS树+树的点分治

    题目描述 给一个包含n个点,m条边的无向连通图.从顶点1出发,往其余所有点分别走一次并返回. 往某一个点走时,选择总长度最短的路径走.若有多条长度最短的路径,则选择经过的顶点序列字典序最小的那条路径( ...

  5. 树和堆(julyedu网课整理)

    date: 2018-12-05 16:59:15 updated: 2018-12-05 16:59:15 树和堆(julyedu网课整理) 1 定义 1.1 树的定义 它是由n(n>=1)个 ...

  6. CF487E Tourists(圆方树+树链剖分+multiset/可删堆)

    CF487E Tourists(圆方树+树链剖分+multiset/可删堆) Luogu 给出一个带点权的无向图,两种操作: 1.修改某点点权. 2.询问x到y之间简单路径能走过的点的最小点权. 题解 ...

  7. 【BZOJ 3626】 [LNOI2014]LCA【在线+主席树+树剖】

    题目链接: TP 题解:   可能是我比较纱布,看不懂题解,只好自己想了…… 先附一个离线版本题解[Ivan] 我们考虑对于询问区间是可以差分的,然而这并没有什么卵用,然后考虑怎么统计答案. 首先LC ...

  8. 主席树+树链剖分——南昌邀请赛Distance on the tree

    学了差不多一星期的主席树+树链剖分,再来看这题发现其实是个板子题 一开始想复杂了,以为要用类似求树上第k大的树上差分思想来解决这道题,但其实树链上<=k的元素个数其实直接可以用树链剖分来求 具体 ...

  9. HDU 3333 Turing Tree 离线 线段树/树状数组 区间求和单点修改

    题意: 给一个数列,一些询问,问你$[l,r]$之间不同的数字之和 题解: 11年多校的题,现在属于"人尽皆知傻逼题" 核心思想在于: 对于一个询问$[x,R]$ 无论$x$是什么 ...

  10. acm 2015北京网络赛 F Couple Trees 主席树+树链剖分

    提交 题意:给了两棵树,他们的跟都是1,然后询问,u,v 表 示在第一棵树上在u点往根节点走 , 第二棵树在v点往根节点走,然后求他们能到达的最早的那个共同的点 解: 我们将第一棵树进行书链剖,然后第 ...

随机推荐

  1. Conservative GC (Part one)

    目录 保守式GC 不明确的根 指针和非指针的区别 貌似指针的非指针 不明确数据结构 优点 准确式GC 正确的根 打标签 不把寄存器和栈等当做根 优点 缺点 间接引用 经由句柄引用对象 优缺点 保守式G ...

  2. Linux学习总结(5)——CentOS常用的目录文件操作命令

    CentOS常用的目录文件操作命令 一.路径操作的CentOS常用命令  cd pwd  NO1. 显示当前路径  [root@rehat root]# pwd  NO2. 返回用户主目录  [roo ...

  3. es69

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. JSP从选择到放弃

    JSP为什么会出现?出现的原因? ①因为在开发web网站时候,返现servlet做界面比较麻烦,于是出现了jsp. 运行在服务端(Java server pages)基于servlet,对servle ...

  5. IIS文件上传大小修改配置说明

    原因:Web 服务器上的请求筛选被配置为拒绝该请求,因为内容长度超过配置的值(IIS 7 默认文件上传大小时30M). 解决:IIS7更改asp.net文件上传大小限制 步骤如下: 1.    修改I ...

  6. Day1上午解题报告

    预计分数:100+60+0=160 实际分数:100+30+20=150 T1立方数(cubic) 题目描述 LYK定义了一个数叫“立方数”,若一个数可以被写作是一个正整数的3次方,则这个数就是立方数 ...

  7. Nabou应用实例

      本文接上文 <完整性检查工具Nabou> http://chenguang.blog.51cto.com/350944/280712650) this.width=650;" ...

  8. Android 关于::app:clean :app:preBuild UP-TO-DATE :app:preDebugBuild UP-TO-DATE,引用jar冲突问题

    错误提示: Information:Gradle tasks [:app:clean, :app:generateDebugSources, :app:generateDebugAndroidTest ...

  9. vue 使用同一组件,切换时不触发created、mounted钩子

    两个页面参数不同使用同一组件,默认情况下当这两个页面切换时并不会触发created或者mounted钩子. 方法一:通过watch $route的变化来做处理 watch: { $route() { ...

  10. sql%rowcount 返回影响行数

    oracle中.返回影响行数是:If sql%rowcount 举例: update ut_calenderStatus t set t.calenderstatus=pi_flg, t.m=pi_M ...