首先得承认伊德利拉美貌盖世无双将数列改成数后处理起来更舒服
什么是平衡树
更广泛的定义:左右子树高度不超过 1 的
如果将这东西和二叉搜索树结合,便是平衡树搜索树
平衡树分类:
- treap 随机
- splay 贪心
- fhq 合并 分裂
fhq 实现
合并
给出两个树,根分别为 a、b,如果我们将 a 作为根,那么 b 将会占掉 a 的一个儿子,所以节省脑细胞,如果通过要占那个儿子决定谁是根,当占掉儿子后那么原来那个儿子所在的子树就需要和 b 树合并。
分裂
将一个树按 v 分裂并,一边为小于等于 v
我们选择分成俩个树 a、b
如果当前这个根的权值小于等于 v,那么我们将当前节点以及左儿子全部给 a,但是右子树可能存在小于等于 v 的,所以我们需要继续往下走,继续切。
整体来说就像切蛋糕,假设我要吃一块稀奇古怪的,而每一块可能和另一块共顶一块巧克力,所以在切的时候必须绕过巧克力。
稍微讲一下应用好吧
P1486 [NOI2004] 郁闷的出纳员
OK呀,一眼上去,我们要维护一个全自动的处死机,我们可以形象的解释为:
我们可以区间(全局)加减法
看到这句时你的感受应该是:看到这个我们想到了线段树!
我们可以删掉小于最低值的人
看到这句时你的感受应该是:看到这个我们想到了一个动态维护点权的支持增删改查的 B(这里主要是因为一眼上去没有东西好做) 玩意
总的一句来说我们需要一个动态维护点权的支持增删改查的在 logn 的时复的数据结构
好,那么,会的人应该已经开始笑了,不会的我们来一个个分析
动态增删改查,很简单,我们可以用一颗树来维护,方便一点,二叉树
接下来,他要logn,所以我们很快想到要让他平衡,好,那么会一点的也开始笑了
实在不会?最后我们考虑什么平衡树可以区间加减,splay?fhq?
都行,问题来了,我们应该怎么实现动态维护点权
!当然,我们可以用懒标记来修改 !当然,我们需要下传标记 !我们似乎已经成功了
代码:是不是很弱智