splay详解(三)

前言

上一节咱们学习了splay所能解决的基本问题,这节我来说一下splay怎么搞区间问题html

实现

splay搞区间问题很是简单,好比咱们要在区间$l,r$上搞事情,那么咱们首先把$l$的前驱旋转到根节点函数

再把$r$的后继旋转到根节点的右儿子学习

那么此时根节点的右儿子的左儿子所表明的就是区间$l,r$spa

这个应该比较好理解code

而后就能够像线段树的lazy标记同样,给区间$l,r$打上标记,延迟更新,好比区间反转的时候更新的时候直接交换左右儿子htm

这里有一个技巧:若是一个区间被打了两次,那么就至关于不打blog

因此咱们用一个bool变量来储存该节点是否须要被旋转排序

下传函数能够这么写get

inline void pushdown(int x)
{
    if(tree[x].rev)
    {
        swap(tree[x].ch[0],tree[x].ch[1]);
        tree[tree[x].ch[0]].rev^=1;
        tree[tree[x].ch[1]].rev^=1;    
        tree[x].rev=0;
    }
}

 

 

注意每次rotate的时候先下传标记模板

例题

洛谷P3391 【模板】文艺平衡树(Splay)

http://www.cnblogs.com/zwfymqz/p/7899355.html

洛谷P3165 [CQOI2014]排序机械臂

http://www.cnblogs.com/zwfymqz/p/7899271.html

相关文章
相关标签/搜索