Treap树的基础知识
操作
插入
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
void insert( int &k, int x) { if (k==0) { size++;k=size; tr[k].size=tr[k].w=1;tr[k].v=x;tr[k].rnd= rand (); return ; } tr[k].size++; if (tr[k].v==x)tr[k].w++; //每个结点顺便记录下与该节点相同值的数的个数 else if (x>tr[k].v) { insert(tr[k].r,x); if (tr[tr[k].r].rnd<tr[k].rnd)lturn(k); //维护堆性质 } else { insert(tr[k].l,x); if (tr[tr[k].l].rnd<tr[k].rnd)rturn(k); } } |
删除
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
void del( int &k, int x) { if (k==0) return ; if (tr[k].v==x) { if (tr[k].w>1) { tr[k].w--;tr[k].size--; return ; //若不止相同值的个数有多个,删去一个 } if (tr[k].l*tr[k].r==0)k=tr[k].l+tr[k].r; //有一个儿子为空 else if (tr[tr[k].l].rnd<tr[tr[k].r].rnd) rturn(k),del(k,x); else lturn(k),del(k,x); } else if (x>tr[k].v) tr[k].size--,del(tr[k].r,x); else tr[k].size--,del(tr[k].l,x); } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
proceduredel(x:longint); var now,MinMax,p:point; begin now:=root; //root为根指针 null^.x:=x; whilenow^.x<>xdo begin p:=now; ifnow^.x>xthen now:=now^.l else now:=now^.r; end; ifnow=nullthen //没找到X exit ; ifnow^.l<>nullthen //左子树不为空,往左找 begin MinMax:=now^.l; p:=now; whileMinMax^.r<>nulldo begin p:=MinMax; MinMax:=MinMax^.r; end; now^.x:=MinMax^.x; ifp<>nowthen p^.r:=MinMax^.l else p^.l:=MinMax^.l; dispose(MinMax); end else ifnow^.r<>nullthen //右子树不为空,往右找 begin MinMax:=now^.r; p:=now; whileMinMax^.l<>nulldo begin p:=MinMax; MinMax:=MinMax^.l; end; now^.x:=MinMax^.x; ifp<>nowthen p^.l:=MinMax^.r else p^.r:=MinMax^.r; dispose(MinMax); end else //X本身是叶子 begin ifp^.x>xthen p^.l:=null else p^.r:=null; dispose(now); end; end; |
1
2
3
4
5
6
7
8
9
10
|
void rturn( int &k) { int t=tr[k].l;tr[k].l=tr[t].r;tr[t].r=k; k=t; } void lturn( int &k) { int t=tr[k].r;tr[k].r=tr[t].l;tr[t].l=k; tk=t; } |
我觉得这个模板挺好的!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
//by hzwer #include<iostream> #include<cstdio> #include<cstdlib> using namespace std; struct data{ int l,r,v,size,rnd,w; }tr[100005]; int n,size,root,ans; void update( int k) //更新结点信息 { tr[k].size=tr[tr[k].l].size+tr[tr[k].r].size+tr[k].w; } void rturn( int &k) { int t=tr[k].l;tr[k].l=tr[t].r;tr[t].r=k; tr[t].size=tr[k].size;update(k);k=t; } void lturn( int &k) { int t=tr[k].r;tr[k].r=tr[t].l;tr[t].l=k; tr[t].size=tr[k].size;update(k);k=t; } void insert( int &k, int x) { if (k==0) { size++;k=size; tr[k].size=tr[k].w=1;tr[k].v=x;tr[k].rnd= rand (); return ; } tr[k].size++; if (tr[k].v==x)tr[k].w++; else if (x>tr[k].v) { insert(tr[k].r,x); if (tr[tr[k].r].rnd<tr[k].rnd)lturn(k); } else { insert(tr[k].l,x); if (tr[tr[k].l].rnd<tr[k].rnd)rturn(k); } } void del( int &k, int x) { if (k==0) return ; if (tr[k].v==x) { if (tr[k].w>1) { tr[k].w--;tr[k].size--; return ; } if (tr[k].l*tr[k].r==0)k=tr[k].l+tr[k].r; else if (tr[tr[k].l].rnd<tr[tr[k].r].rnd) rturn(k),del(k,x); else lturn(k),del(k,x); } else if (x>tr[k].v) tr[k].size--,del(tr[k].r,x); else tr[k].size--,del(tr[k].l,x); } int query_rank( int k, int x) { if (k==0) return 0; if (tr[k].v==x) return tr[tr[k].l].size+1; else if (x>tr[k].v) return tr[tr[k].l].size+tr[k].w+query_rank(tr[k].r,x); else return query_rank(tr[k].l,x); } int query_num( int k, int x) { if (k==0) return 0; if (x<=tr[tr[k].l].size) return query_num(tr[k].l,x); else if (x>tr[tr[k].l].size+tr[k].w) return query_num(tr[k].r,x-tr[tr[k].l].size-tr[k].w); else return tr[k].v; } void query_pro( int k, int x) { if (k==0) return ; if (tr[k].v<x) { ans=k;query_pro(tr[k].r,x); } else query_pro(tr[k].l,x); } void query_sub( int k, int x) { if (k==0) return ; if (tr[k].v>x) { ans=k;query_sub(tr[k].l,x); } else query_sub(tr[k].r,x); } int main() { scanf ( "%d" ,&n); int opt,x; for ( int i=1;i<=n;i++) { scanf ( "%d%d" ,&opt,&x); switch (opt) { case 1:insert(root,x); break ; case 2:del(root,x); break ; case 3: printf ( "%d\n" ,query_rank(root,x)); break ; case 4: printf ( "%d\n" ,query_num(root,x)); break ; case 5:ans=0;query_pro(root,x); printf ( "%d\n" ,tr[ans].v); break ; case 6:ans=0;query_sub(root,x); printf ( "%d\n" ,tr[ans].v); break ; } } return 0; } |
Treap树的基础知识的更多相关文章
- Linux驱动之设备树的基础知识
前期知识 1. 如何编写一个简单的Linux驱动(一)--驱动的基本框架 2. 如何编写一个简单的Linux驱动(二)--设备操作集file_operations 3. 如何编写一个简单的 ...
- c语言-树的基础知识
第一.树的定义: 1.有且只有一个称为根的节点 2.有若干个互不相交的子树,这些子树本身也是一颗树 第二.专业术语: 树的深度:从根节点到最低层,节点的层数 ,称之为树的深度. 根节点是第一 ...
- AST抽象语法树——最基础的javascript重点知识,99%的人根本不了解
AST抽象语法树——最基础的javascript重点知识,99%的人根本不了解 javascriptvue-clicommonjswebpackast 阅读约 27 分钟 抽象语法树(AST),是一 ...
- Linux dts 设备树详解(一) 基础知识
Linux dts 设备树详解(一) 基础知识 Linux dts 设备树详解(二) 动手编写设备树dts 文章目录 1 前言 2 概念 2.1 什么是设备树 dts(device tree)? 2. ...
- Oracle数据库基础知识
oracle数据库plsql developer 目录(?)[-] 一 SQL基础知识 创建删除数据库 创建删除修改表 添加修改删除列 oracle cascade用法 添加删除约束主键外 ...
- Linux基础知识整理
一.基础知识 1.Linux简介 Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU的操作系统.它能运行主要的UNIX工具软件 ...
- 基础知识漫谈(2):从设计UI框架开始
说UI能延展出一丢丢的东西来,光java就有swing,swt/jface乃至javafx等等UI toolkit,在桌面上它们甚至都不是主流,在web端又有canvas.svg等等. 基于这些UI工 ...
- HTML DOM基础知识
HTML DOM基础知识 一.什么是DOM? 1.HTML DOM 定义了访问和操作HTML文档的标准方法. 2.HTML DOM 把 HTML 文档呈现为带有元素.属性和文本的树结构(节点树). 3 ...
- Unity3D基础知识梳理
这段时间在做Unity的项目,这差不多是我的第一次实战啊~然后公司来了实习的童鞋要学Unity,但是我一向不靠谱啊,所以只能帮他们稍微梳理下基础的东西了啊,唉~学长只能帮你们到这里了~顺便就把自己这两 ...
随机推荐
- ffrpc相关文章列表
ffrpc 是异步c++通信库.可以说是传统rpc模式和zeromq模式的一个结合,采用broker模式封装client和server之间的拓扑关系,而client和server的通信仍然按照请求应答 ...
- saiku执行过程代码跟踪
使用了很久的saiku,决定跟踪一下代码,看看它的执行核心过程: 一.入口controller代码 1.1.页面打开之后,会发送一个ajax请求 Request URL: http://l-tdata ...
- Java IO 之 InputStream源码
Writer :BYSocket(泥沙砖瓦浆木匠) 微 博:BYSocket 豆 瓣:BYSocket FaceBook:BYSocket Twitter ...
- windows下配置启动多个mysql服务
查找配置做下记录 先安装mysql5.6,安装不在介绍 接下来配置启动另一个mysql服务, 1:先到服务里停止在运行的mysql服务 2:到mysql的安装目录下(默认安装目录在c:\Program ...
- VSFTPD添加用户
VSFTPD的安装网上有很多教程这里就不多说了,这里主要是针对做主机空间服务的朋友在安装好vsftpd后如何为用户增加ftp账号 先来看一看我们一般在*inux系统下面如何增加用户的 #adduser ...
- win平台,apache通过web访问svn
上个月用php写一个在线打包lua变成luac,碰到个权限问题.pysvn无法更新.网上搜了好半天都找不到解决方法.最好还是自己解决了. 解决方法也很简单,找到aphache服务,提权限就行了.lin ...
- Unity3d插件汇总
Unity3d 中的svn插件 插件下载地址:http://www.dehome.net/down/viewfile.php?file_id=53
- Unity3d删除无用的美术资源
这个插件是我在国外网站逛论坛发现的,试用了一下非常好用,是一个轻量级的插件就一个类.开发中尤其是和美术合作的时候,可能你会发现Project视图中有很多没有用到的资源,但是你又不敢删除,因为你不知道那 ...
- DataContractSerializer序列化与反序列化遇到的奇怪问题
private static void Serialize1(string filename, object obj) { var stream = new F ...
- 读书笔记_Effective_C++_条款四十三:学习处理模板化基类的名称
背景是这样的,有两个不同的公司,然后想设计一个MessageSender,为这两个公司发送不同的消息,既支持明文发送SendClearText,也支持密文发送SendEncryptedText.一种思 ...