码迷,mamicode.com
首页 > 其他好文 > 详细

Splay详解(三)

时间:2017-11-26 17:48:37      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:标记   target   理解   www   直接   pushd   机械   变量   int   

前言

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

实现

splay搞区间问题非常简单,比如我们要在区间$l,r$上搞事情,那么我们首先把$l$的前驱旋转到根节点

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

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

这个应该比较好理解

然后就可以像线段树的lazy标记一样,给区间$l,r$打上标记,延迟更新,比如区间反转的时候更新的时候直接交换左右儿子

这里有一个技巧:如果一个区间被打了两次,那么就相当于不打

所以我们用一个bool变量来储存该节点是否需要被旋转

下传函数可以这么写

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

Splay详解(三)

标签:标记   target   理解   www   直接   pushd   机械   变量   int   

原文地址:http://www.cnblogs.com/zwfymqz/p/7899379.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!