1. 程式人生 > >Splay詳解(三)

Splay詳解(三)

.html rotate cqoi2014 org tps 線段樹 .cn html highlight

前言

上一節我們學習了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詳解(三)