#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. 安装php-ldap模块

    php-ldap模块作用就是实现ldap认证,因此需要安装 1.安装软件包解决依赖 yum install openldapyum install openldap-devel 2.拷贝库文件 cp ...

  2. [Android]新建项目继承Activity不继承ActionBarActivity

    在SDK更新后,在eclipse新建Android项目时.我们常常会碰到这样一种事情:新建的MainActivity不再继承Activity而是继承ActionBarActivity,因为一些人的开发 ...

  3. vim中使用正則表達式

    一.使用正則表達式的命令 使用正則表達式的命令最常见的就是 / (搜索)命令. 其格式例如以下: /正則表達式 还有一个非常实用的命令就是 :s(替换)命令,将第一个//之间的正則表達式替换成第二个/ ...

  4. 智课雅思词汇---二、词根acu和acr

    智课雅思词汇---二.词根acu和acr 一.总结 一句话总结:acu和acr:sharp锋利的,敏捷的: acuteacutelyacuity sharp锋利的,敏捷的 1.词根acr表示什么意思? ...

  5. 洛谷P1720 月落乌啼算钱

    目背景 (本道题目木有以藏歌曲……不用猜了……) <爱与愁的故事第一弹·heartache>最终章. 吃完pizza,月落乌啼知道超出自己的预算了.为了不在爱与愁大神面前献丑,只好还是硬着 ...

  6. C#导出EXCEL(DataTable导出EXCEL)

    using System; using System.Collections.Generic; using System.Text; using System.Data; using System.I ...

  7. vue 中表单 [v-bind:true-value="a" v-bind:false-value="b"] 的用法

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

  8. AsyncTask源代码翻译

    前言: /** <p>AsyncTask enables proper and easy use of the UI thread. This class allows to perfor ...

  9. 1.3 Quick Start中 Step 4: Send some messages官网剖析(博主推荐)

    不多说,直接上干货! 一切来源于官网 http://kafka.apache.org/documentation/ Step 4: Send some messages Step : 发送消息 Kaf ...

  10. FineUI 页面跳转

    要加 EnableAjax=false; <f:Button ID="btn1" EnableAjax="false" OnClick="btn ...