上一節咱們學習了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的時候先下傳標記模板
http://www.cnblogs.com/zwfymqz/p/7899355.html
http://www.cnblogs.com/zwfymqz/p/7899271.html