正在备战 CSP-S 的小 w 愤然写下了这篇文章,因为赛前的模拟考试让 ta 摸不着头脑。比赛结束了,小 w 考的很糟糕,然而,ta 在第四题的题解里看到了这样一句话:

平衡树是提高组考纲里的内容。

岂有此理,居然敢明目张胆地超纲!小 w 清楚,这场比赛的难度是对标 NOIp 的,ta 心里想道:既然这样,我一定要学会平衡树!! 于是,wkd 的平衡树学习之路就这样开始了......

思想引领

平衡树好像很吓人啊,看不懂,不想学。记住,特别是在学新算法的时候,千万不要被算法的名字给吓跑了,平衡树就是一棵二叉树而已,每个结点存储一个值,没了。~~当然,好像也没有这么夸张的简单。~~总之,学习平衡树之前,我们得先认识一种特别的二叉树:二叉搜索树!

Treap

没错,我们平衡树学习的第一站就是 Treap! Treap 是什么?其实 Treap 的名字类似于缝合怪,也就是“Tree + Heap = Treap”。Tree 就是树,Heap 就是堆,那么 Treap 可想而知就是一棵树满足堆的性质。这里我们维护的是一个大根堆,而我们点上的权值就多了一种满足堆性质的权值,这个权值是随机的。那么,有了这个堆的性质,能帮助到我们什么呢?没错,只要有了它,我们就可以保证二叉搜索树的高度近似于 $\log n$,也就是平衡了!为什么会这样呢?