無旋treap的初步學習

2021-08-11 18:09:55 字數 2354 閱讀 4340

是一種詭異的平衡樹

最主要的操作

就是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值來維護平衡,把每個點按照小...