treap-名次树-树堆
#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-名次树-树堆的更多相关文章
- 平衡树及笛卡尔树讲解(旋转treap,非旋转treap,splay,替罪羊树及可持久化)
在刷了许多道平衡树的题之后,对平衡树有了较为深入的理解,在这里和大家分享一下,希望对大家学习平衡树能有帮助. 平衡树有好多种,比如treap,splay,红黑树,STL中的set.在这里只介绍几种常用 ...
- JavaScript 数据结构与算法之美 - 非线性表中的树、堆是干嘛用的 ?其数据结构是怎样的 ?
1. 前言 想学好前端,先练好内功,内功不行,就算招式练的再花哨,终究成不了高手. 非线性表(树.堆),可以说是前端程序员的内功,要知其然,知其所以然. 笔者写的 JavaScript 数据结构与算法 ...
- CF487E Tourists 【圆方树 + 树剖 + 堆】
题目链接 CF487E 题解 圆方树 + 树剖 裸题 建好圆方树维护路径上最小值即可 方点的值为其儿子的最小值,这个用堆维护 为什么只维护儿子?因为这样修改点的时候就只需要修改其父亲的堆 这样充分利用 ...
- 【bzoj4016】[FJOI2014]最短路径树问题 堆优化Dijkstra+DFS树+树的点分治
题目描述 给一个包含n个点,m条边的无向连通图.从顶点1出发,往其余所有点分别走一次并返回. 往某一个点走时,选择总长度最短的路径走.若有多条长度最短的路径,则选择经过的顶点序列字典序最小的那条路径( ...
- 树和堆(julyedu网课整理)
date: 2018-12-05 16:59:15 updated: 2018-12-05 16:59:15 树和堆(julyedu网课整理) 1 定义 1.1 树的定义 它是由n(n>=1)个 ...
- CF487E Tourists(圆方树+树链剖分+multiset/可删堆)
CF487E Tourists(圆方树+树链剖分+multiset/可删堆) Luogu 给出一个带点权的无向图,两种操作: 1.修改某点点权. 2.询问x到y之间简单路径能走过的点的最小点权. 题解 ...
- 【BZOJ 3626】 [LNOI2014]LCA【在线+主席树+树剖】
题目链接: TP 题解: 可能是我比较纱布,看不懂题解,只好自己想了…… 先附一个离线版本题解[Ivan] 我们考虑对于询问区间是可以差分的,然而这并没有什么卵用,然后考虑怎么统计答案. 首先LC ...
- 主席树+树链剖分——南昌邀请赛Distance on the tree
学了差不多一星期的主席树+树链剖分,再来看这题发现其实是个板子题 一开始想复杂了,以为要用类似求树上第k大的树上差分思想来解决这道题,但其实树链上<=k的元素个数其实直接可以用树链剖分来求 具体 ...
- HDU 3333 Turing Tree 离线 线段树/树状数组 区间求和单点修改
题意: 给一个数列,一些询问,问你$[l,r]$之间不同的数字之和 题解: 11年多校的题,现在属于"人尽皆知傻逼题" 核心思想在于: 对于一个询问$[x,R]$ 无论$x$是什么 ...
- acm 2015北京网络赛 F Couple Trees 主席树+树链剖分
提交 题意:给了两棵树,他们的跟都是1,然后询问,u,v 表 示在第一棵树上在u点往根节点走 , 第二棵树在v点往根节点走,然后求他们能到达的最早的那个共同的点 解: 我们将第一棵树进行书链剖,然后第 ...
随机推荐
- C++11 volatile 类型
volatile作用: 作为指令关键字,确保本条指令不会受到编译器的优化而省略,而且要求每次直接读值. 定义: volatile int nTest; volatile关键字是一种类型修饰符,用它声明 ...
- [Zabbix] 怎样实现邮件报警通知以及免费短信报警通知
前提条件: (1) zabbixserver端已经安装成功而且执行. (2) zabbixclient已经成功建立而且执行. 1 下载而且安装msmtp软件 Wget http://sourcefo ...
- Maven实战(八)---模块划分
为了防止传递依赖,我们各个模块之间尽量用直接依赖的方式.本篇文章介绍多模块化开发.我们做过Maven项目的都知道.我们的项目一般都是分模块的,每一个模块都会相应着一个POM.xml文件,它们之间通过继 ...
- centOS6.3(64bit)Hadoop的Eclipse开发环境搭建
操作系统centos6.3(64位) 一个namenode 两个datanode Hadoop版本号:hadoop-1.1.2 Eclipse版本号:eclipse-standard-kepler-S ...
- Linq复杂对象查询
复杂的查询对象, using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...
- rtsp和sdp协议简介
RTSP是由Real network 和Netscape共同提出的如何有效地在IP网络上传输流媒体数据的应用层协议. 实时流协议(RTSP)建立并控制一个或几个时间同步的连续流媒体,如音频和视频.尽管 ...
- #学习笔记#——JavaScript 数组部分编程(五)
11.为数组 arr 中的每个元素求二次方.不要直接修改数组 arr,结果返回新的数组 function square(arr) { var resultArr=new Array(); for(va ...
- Android 通过OnScrollListener来监听RecyclerView的位置
最近做一个漫画app,在阅读漫画界面需要通过获取recyclerView的位置来实时更新界面上的图片进度(比如1/9), 查阅资料得知了可以通过LayoutManager来获取recyclerView ...
- ActiveMQ学习总结(7)——ActiveMQ使用场景
MQ简介: MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过写和检索出入列队的针对应用程序的数据(消息)来通信,而无需专用连接来链接它们.消息传 ...
- NB大了,增强现实走进安防行业了!竟然还有智能家居的规划!
增强现实系统故事性功能解说 作者:李欢 工号:2288 电话:18938902295 邮箱:lihuan@gosuncn.com 前言: 本文仅适用于2014北京安防展,增强现实展区人员学 ...