标签:查询 treap code 区间 flag 复杂 标记 splay style
splay、treap、set、红黑树、avl、B树
splay: 平衡二叉树,经过左旋和右旋操作,不会改变中序遍历的顺序。维护的是二叉树的一个中序序列,同时调整树的高度。
右旋要变的信息:
在插入和查询操作x的时候,都会把x变到树根的位置。
核心:每操作一个节点,均将该节点旋转到树根。一个点用到的话,之后的话很可能会再次用到。平均意义上,每次操作的时间复杂度是log(n)
怎样每次把某个点旋转到树根:
splay(x, k):将点x旋转到点k下面,如果k = 0,那么将x旋转到根;k为根节点,把x转到根节点的下面。
将一个序列插到y的后面。找到y的后继z。
1)将y转到根,splay(y, 0)
2)将z转到y的下面,splay(z, y)
splay如何去维护信息:
2437. splay
1)找第k个数,size。递归
2)懒标记,flag(整个区间要不要翻转)
pushup:维护信息,放在旋转最后,利用两儿子的信息算出根节点的信息,root->size = root->left->size + root->right->size + 1;
pushdown() :递归之前。下传懒标记,然后递归翻转左右儿子。swap(root->left, root->right),将标记下传到左右儿子,将当前结点标记清空。
splay时时刻刻保证中序遍历是我们当前序列的顺序。
标签:查询 treap code 区间 flag 复杂 标记 splay style
原文地址:https://www.cnblogs.com/longxue1991/p/14618629.html