Splay詳解(三)
阿新 • • 發佈:2017-11-26
.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詳解(三)