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

相關文章
相關標籤/搜索