zoukankan      html  css  js  c++  java
  • splay详解(三)

    前言

    上一节我们学习了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

  • 相关阅读:
    2015 8月 做题记录
    Nim及SG函数
    CodeForces
    CF 546E(最大流
    CF 544E(状压
    树形DP
    HDU 4173(计算几何
    HDU 4081(最小生成树
    codeforeces 540E(树状数组
    Linux nginx安装
  • 原文地址:https://www.cnblogs.com/zwfymqz/p/7899379.html
Copyright © 2011-2022 走看看