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点往根节点走,然后求他们能到达的最早的那个共同的点 解: 我们将第一棵树进行书链剖,然后第 ...
随机推荐
- Conservative GC (Part one)
目录 保守式GC 不明确的根 指针和非指针的区别 貌似指针的非指针 不明确数据结构 优点 准确式GC 正确的根 打标签 不把寄存器和栈等当做根 优点 缺点 间接引用 经由句柄引用对象 优缺点 保守式G ...
- Linux学习总结(5)——CentOS常用的目录文件操作命令
CentOS常用的目录文件操作命令 一.路径操作的CentOS常用命令 cd pwd NO1. 显示当前路径 [root@rehat root]# pwd NO2. 返回用户主目录 [roo ...
- es69
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- JSP从选择到放弃
JSP为什么会出现?出现的原因? ①因为在开发web网站时候,返现servlet做界面比较麻烦,于是出现了jsp. 运行在服务端(Java server pages)基于servlet,对servle ...
- IIS文件上传大小修改配置说明
原因:Web 服务器上的请求筛选被配置为拒绝该请求,因为内容长度超过配置的值(IIS 7 默认文件上传大小时30M). 解决:IIS7更改asp.net文件上传大小限制 步骤如下: 1. 修改I ...
- Day1上午解题报告
预计分数:100+60+0=160 实际分数:100+30+20=150 T1立方数(cubic) 题目描述 LYK定义了一个数叫“立方数”,若一个数可以被写作是一个正整数的3次方,则这个数就是立方数 ...
- Nabou应用实例
本文接上文 <完整性检查工具Nabou> http://chenguang.blog.51cto.com/350944/280712650) this.width=650;" ...
- Android 关于::app:clean :app:preBuild UP-TO-DATE :app:preDebugBuild UP-TO-DATE,引用jar冲突问题
错误提示: Information:Gradle tasks [:app:clean, :app:generateDebugSources, :app:generateDebugAndroidTest ...
- vue 使用同一组件,切换时不触发created、mounted钩子
两个页面参数不同使用同一组件,默认情况下当这两个页面切换时并不会触发created或者mounted钩子. 方法一:通过watch $route的变化来做处理 watch: { $route() { ...
- sql%rowcount 返回影响行数
oracle中.返回影响行数是:If sql%rowcount 举例: update ut_calenderStatus t set t.calenderstatus=pi_flg, t.m=pi_M ...