是一種詭異的平衡樹
最主要的操作
就是split(拆分成兩棵子樹)和merge(合併為一棵子樹)
這個。。。就不講了吧。因題而異。
所以我寫出來是為了什麼?
分為兩種
一種是以前k個和剩下的來拆分,適用於區間操作時
//r1為前k個的子樹的根,r2為剩下的子樹的根
void split_treap(int x,int k,int& r1,int& r2)
int sz=tree[tree[x].l].sz;
if(sz>=k)
else
}
第二種是按照key值,適用於正常的平衡樹
//r1為小於等於key值子樹的根,r2為剩下的子樹的根
void split_treap(int x,int val,int& r1,int& r2)
if(tree[x].key>val)
else
}
把我們分出來的兩個子樹合在一起
注意必須當滿足一棵子樹中所有的key值都小於等於另一顆子樹時才能合併
int merge_treap(int x,int y)
else
}
尋找第k小的值
給出一種迭代的寫法
int find_key_treap(int x,int k)
}}
根據值尋找排名,如果存在多個這種值,返回最小的排名
int find_rank_treap(int x,int val)
新建並插入值為val的節點
void insert_treap(int val)
刪除值為val的節點
void delete_treap(int val)
求x的前驅(前驅定義為小於x,且最大的數)
int find_previous_treap(int val)
求x的後繼(後繼定義為大於x,且最小的數)
int find_next_treap(int val)
把區間[l,r]翻轉(比如10 30 20翻轉[1,3]成20 10 30)
void reverse_treap(int l,int r)
求區間[1,k]的和(怎麼求[l,r]我覺得就沒必要說了吧)
long
long sum_treap(int x,int k)
無旋treap相比旋轉的treap,最大的區別就是不旋轉(廢話!)
由於不旋轉,才能進行我們可持久化的改造
其實跟其他資料結構的可持久化改造類似,就是存乙個root陣列,並且新建節點
直接上**吧,不懂可以看看注釋
題目:洛谷3835
#include
#include
#include
#include
using
namespace
std;
const
int n=5*1e5+5,m=15000000;
struct node
node(int _key):l(0),r(0),key(_key),fix(rand()),sz(1){}
}tree[m];
int ncnt;
int root[n];
void update(int a)
//為什麼merge操作不需要新建節點呢,因為合併的一定是同時間的
int merge_treap(int x,int y)
else
}//在split操作中新建節點
void split_treap(int x,int val,int& r1,int& r2)
if(tree[x].key<=val)
else
}int find_key_treap(int x,int k)
}}int find_rank_treap(int&rt,int val)
void insert_treap(int&rt,int val)
void delete_treap(int&rt,int val)
int find_previous_treap(int&rt,int val)
int find_next_treap(int&rt,int val)
int main()
}
無旋treap學習小記
高一才學這麼基本的平衡樹,退役了 鑑於旋轉treap不能可持久化,與splay相比除了常數小以外沒有什麼不同,所以就不學了。treap tree heap,即二叉搜尋樹 堆 它的中序遍歷是有序的,這是二叉搜尋樹的性質。且對於每乙個點有乙個隨機的鍵值,對於整個樹的任意一棵子樹,鍵值滿足堆的性質。基於隨...
總結 無旋treap
顧名思義就是沒有旋轉操作的treap.還是很好打的.畢竟旋轉操作旋轉上天.兩個核心操作 split和merge split是將一棵樹分成兩棵樹的操作.注意這裡的要求是對於確定的樹,將其前k個點分成新樹,剩下的點變成另一顆新樹,因此可能出現多個切割的地方.對於乙個節點來說,我們必然只會處理它的一顆子樹...
fhq treap(無旋treap) 學習筆記
首先最好要會寫treap 也先了解一下笛卡爾樹是什麼。fhq treap和treap同樣有乙個隨機分配的rnd值,用於平衡,但fhq treap不需要旋轉操作來維持平衡,因為有兩個神奇的操作merge和split 在兩種操作之前,要明確的一點是fhq treap依靠rnd值來維護平衡,把每個點按照小...