題幹:splay模板,要求維護區間反轉。
splay是一種碼量小於treap,但支援排名,前驅後繼等treap可求的東西,也支援區間反轉的平衡樹。
但是有兩個壞處:
1.splay常數遠遠大於treap以及stl中的set。
2.沒有可持久化splay,但有可持久化treap。
下面是**:
1.pushup以及pushdown
pushup用於維護某點所在子樹大小。
void pushup(intu)
一行。pushdown用於標記下推。
void pushdown(intu)}
2.rotate
rotate相當於treap中的lturn和rturn,是將x點轉到他的父節點處。
void rotate(intx)
注意改變父子關係時的順序問題,還有兩個pushup,應該先pushup兒子後pushup父親。
3.splay(splay核心操作)
splay(a,b),將a旋轉到b的兒子處。
下面是雙旋splay:
void splay(int x,intgoal)
if(goal==0)rot=x;
}
**中while中的if,機房普遍認為是為了維護整棵樹的深度。
4.insert
碼量比treap少很多:
void insert(intx)
5.查詢排名
**:
int query_kth(intk)}
6.區間旋轉
先查詢前驅後繼,然後把所在子樹夾到前驅後繼之間,乙個標記解決問題。
void chg(int l,intr)
最後:推極大極小,推極大極小,推極大極小!!!
全**就不粘了。
模板 文藝平衡樹(Splay)
這是一道經典的splay模板題 文藝平衡樹。輸入格式 第一行為n,m n表示初始序列有n個數,這個序列依次是 1,2,cdots n 1,n 1,2,n 1,n m表示翻轉操作次數 接下來m行每行兩個數 l,r l,r 資料保證 1 leq l leq r leq n1 l r n 輸出格式 輸出一...
文藝平衡樹 Splay
鏈結 splay板子題 結果還調了很久的題,這就是搞文化課的 顯然維護陣列下標,使得splay的中序遍歷始終為當前數列 值得注意 旋轉時始終要記得更新節點 注意更新root節點 每次寫都忘.jpg includeusing namespace std const int maxn 100000 10...
文藝平衡樹Splay
splay是平衡樹 splay 是平衡樹的一種 基本思想是,對於查詢頻率較高的節點,使其處於離根節點相對較近的節點。spaly的基本操作有 struct node tr n 這個旋轉操作跟資料結構裡學的平衡樹旋轉操作是一樣的。如下圖,畫的是右旋 x 的操作,藍色的邊表示資訊發生了改變 void ro...