平衡树
其实是重学Splay
Splay是一棵平衡二叉树。
z z
/ 右旋 /
y -----> x
/ \ <----- / \
x C 左旋 A y
/ \ / \
A B B C
Splay规定,每次操作之后都会把这个点旋转到树根。
1.旋转操作
即\(\tt{Splay}\)函数
有如下几种情况:
父亲和儿子是同一边
z x
/ 转y 转x \
y ----> y ----> y
/ / \ \
x x z z
父亲和儿子不是同一边
z z
/ 转x / 转x
y ----> x ----> x
\ / / \
x y y z
2.插入操作
最一般的,直接找到它的位置并插入即可。
若要插入一个序列到 \(y\) 后面,则先将 \(y\) 旋转到根,再将 \(y\) 的后继 \(z\) 旋转到 \(y\) 的下面,接着将序列放到 \(y\) 的左边即可。
3.删除操作
删除序列 \([L,R]\) 。
将 \(L-1\) 转到树根,再将 \(R+1\) 转到 \(L-1\) 下面,将 \(R+1\) 的左子树清空即可。
4.Splay 维护信息
1.找第 k 个数
需要维护子树大小 \(size\) ,整个区间是否要翻转的标记 \(dat\) 。
首先有信息上传 \(\tt{pushup}\)
然后要懒标记下传 \(\tt{pushdown}\)
先交换两个子树,再下传标记。

浙公网安备 33010602011771号