算法模板——平衡树Treap 2
时间:2022-05-08
本文章向大家介绍算法模板——平衡树Treap 2,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
实现功能:同平衡树Treap 1(BZOJ3224 / tyvj1728)
这次的模板有了不少的改进,显然更加美观了,几乎每个部分都有了不少简化,尤其是删除部分,这个参照了hzwer神犇的写法,在此鸣谢,然后,贴模板走人
1 var
2 i,j,k,l,m,n,head,tot:longint;
3 a,b,lef,rig,fix:array[0..100010] of longint;
4 function min(x,y:longint):longint;
5 begin
6 if x<y then min:=x else min:=y;
7 end;
8 function max(x,y:longint):longint;
9 begin
10 if x>y then max:=x else max:=y;
11 end;
12 procedure lt(var x:longint);
13 var f,r:longint;
14 begin
15 if (x=0) or (rig[x]=0) then exit;
16 b[rig[x]]:=b[x];b[x]:=b[lef[x]]+b[lef[rig[x]]]+1;
17 f:=x;r:=rig[x];
18 rig[f]:=lef[r];
19 lef[r]:=f;
20 x:=r;
21 end;
22 procedure rt(var x:longint);
23 var f,l:longint;
24 begin
25 if (x=0) or (lef[x]=0) then exit;
26 b[lef[x]]:=b[x];b[x]:=b[rig[x]]+b[rig[lef[x]]]+1;
27 f:=x;l:=lef[x];
28 lef[f]:=rig[l];
29 rig[l]:=f;
30 x:=l;
31 end;
32 function newp(x:longint):longint;
33 begin
34 inc(tot);newp:=tot;
35 a[tot]:=x;b[tot]:=1;
36 lef[tot]:=0;rig[tot]:=0;
37 fix[tot]:=random(maxlongint);
38 end;
39 procedure ins(var x:longint;y:longint);
40 begin
41 if x=0 then
42 begin
43 x:=newp(y);
44 exit;
45 end;
46 if y<a[x] then
47 begin
48 ins(lef[x],y);b[x]:=b[lef[x]]+b[rig[x]]+1;
49 if fix[lef[x]]<fix[x] then rt(x);
50 end
51 else
52 begin
53 ins(rig[x],y);b[x]:=b[lef[x]]+b[rig[x]]+1;
54 if fix[rig[x]]<fix[x] then lt(x);
55 end;
56 end;
57 procedure del(var x:longint;y:longint);
58 begin
59 if x=0 then exit;
60 if a[x]=y then
61 begin
62 if lef[x]=0 then x:=rig[x] else
63 if rig[x]=0 then x:=lef[x] else
64 if fix[lef[x]]>fix[rig[x]] then
65 begin
66 lt(x);del(lef[x],y);
67 b[x]:=b[lef[x]]+b[rig[x]]+1;
68 end
69 else
70 begin
71 rt(x);del(rig[x],y);
72 b[x]:=b[lef[x]]+b[rig[x]]+1;
73 end;
74 end
75 else if y<a[x] then
76 begin
77 del(lef[x],y);
78 b[x]:=b[lef[x]]+b[rig[x]]+1;
79 end
80 else begin
81 del(rig[x],y);
82 b[x]:=b[lef[x]]+b[rig[x]]+1;
83 end;
84 end;
85 function getrank(x,y:longint):longint;
86 begin
87 if x=0 then exit(0);
88 if y>a[x] then exit(b[lef[x]]+1+getrank(rig[x],y)) else exit(getrank(lef[x],y));
89 end;
90 function rankget(x,y:longint):longint;
91 begin
92 if y=(b[lef[x]]+1) then exit(a[x]);
93 if y<(b[lef[x]]+1) then exit(rankget(lef[x],y)) else exit(rankget(rig[x],y-1-b[lef[x]]));
94 end;
95 function getpre(x,y:longint):longint;
96 begin
97 if x=0 then exit(-maxlongint);
98 if a[x]<y then exit(max(a[x],getpre(rig[x],y))) else exit(getpre(lef[x],y));
99 end;
100 function getsuc(x,y:longint):longint;
101 begin
102 if x=0 then exit(maxlongint);
103 if a[x]>y then exit(min(a[x],getsuc(lef[x],y))) else exit(getsuc(rig[x],y));
104 end;
105 begin
106 readln(n);tot:=0;head:=0;
107 for i:=1 to n do
108 begin
109 readln(j,k);
110 case j of
111 1:ins(head,k);
112 2:del(head,k);
113 3:writeln(getrank(head,k)+1);
114 4:writeln(rankget(head,k));
115 5:writeln(getpre(head,k));
116 6:writeln(getsuc(head,k));
117 end;
118 end;
119 end.
- 大数据面试题整理
- 02-移动端开发教程-CSS3新特性(中)
- 强悍!Java 9 中的9个新特性
- 神经网络反向传播梯度计算数学原理
- Spring Boot 1.5.10 发布:修复重要安全漏洞!!!
- 从零开始写项目第三篇【在线聊天和个人收藏夹】
- TiDB 源码阅读系列文章(六)Select 语句概览
- 从零开始写项目第四篇【搭建Linux环境】
- salesforce零基础学习(八十六)Ajax Toolkit (VF页面中使用及javascript action使用)
- salesforce零基础学习(八十五)streaming api 简单使用(接近实时获取你需要跟踪的数据的更新消息状态)
- 深入nDPI
- 44个Java代码性能优化总结
- 干货:Java正确获取客户端真实IP方法整理
- sublime学习笔记
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法