今天學習了一下非旋tr
eap 聽說效率很高而且可持久化(一臉懵逼qa
q ) 非旋treap主要是兩個操作sp
lit 和me
rge 下面簡單描述一下(得先會tr
eap 啊 ) va
l :點的值 ke
y :ra
nd的值 sp
lit : 就是我們把原tr
eap 拆成兩個tr
eap
x,y 比如以va
lue 為分界線 小於他的在
x 裡,大於他的在
y裡 具體操作時 如果當前點i的va
l[i]
≤val
ue則將他加入
x 中 那麼他的左子樹都肯定小於va
l[i]
所以也在
x 中 接下來我們就去右子樹中繼續操作 那麼下一次如果還往
x裡加j 一定有va
l[j]
>va
l[i]
即應該加在
x 上一次插入點(這裡就是我們剛加的
i) 的右子樹中 那麼在
y 中就是反過來啦
void split(int
now,intint&rtr,int value)
(data[now].val<=value)?(ltr=now,split(data[now].ch[1],data[ltr].ch[1],rtr,value)):(rtr=now,split(data[now].ch[0],ltr,data[rtr].ch[0],value));
up(now);
}
me
rge:剛才把原tr
eap 拆開了 那肯定也要合併 我們這裡講兩個tr
eap
x,y 的合併 其中
x 的所有節點va
l都小於y中的va
l (也是最常用的)
對於當前的x,
y 要是
x 的ke
y值比y 的小 那很明顯 要把
x這個點放靠上的位置 那和sp
lit 相同的 後面再加進來的肯定va
l 都比這個點大 所以加在這個點的右子樹上 同理小於就是反過來啦
void merge(int&now,int s,int b)
(data[s].keynow=s,merge(data[now].ch[1],data[s].ch[1],b)):(now=b,merge(data[now].ch[0],s,data[b].ch[0]));
up(now);
}
具體的其他操作基本上都是建立在這兩個操作上的
我們以模板題p3369 【模板】普通平衡樹(treap/sbt) 為例
直接上**<( ̄▽ ̄)/
#include
#define bug(x) cout<<(#x)<<" "<<(x)<#define ll long long
#define inf int_max
using namespace std;
const
int n=1e5+5;
inline int read()
while(ch>='0'&&ch<='9')
return x*f;
}struct treapdata[n*2];
int m,rt,tot;
void make_data(int&now,int
value)
void up(int now)
void merge(int&now,int s,int b)
(data[s].key1],data[s].ch[1],b)):(now=b,merge(data[now].ch[0],s,data[b].ch[0]));
up(now);
}void split(int now,intint&rtr,int
value)
(data[now].val<=value)?(ltr=now,split(data[now].ch[1],data[ltr].ch[1],rtr,value)):(rtr=now,split(data[now].ch[0],ltr,data[rtr].ch[0],value));
up(now);
}void insert(int
value)
void del(int
value)
void rnk(int
value)
void find(int now,int x)
printf("%d\n",data[now].val);
}void pre(int
value)
void sub(int
value)
int main()
return
0;}
fhq treap(無旋treap) 學習筆記
首先最好要會寫treap 也先了解一下笛卡爾樹是什麼。fhq treap和treap同樣有乙個隨機分配的rnd值,用於平衡,但fhq treap不需要旋轉操作來維持平衡,因為有兩個神奇的操作merge和split 在兩種操作之前,要明確的一點是fhq treap依靠rnd值來維護平衡,把每個點按照小...
平衡樹之非旋Treap
線段樹不支援插入or刪除乙個數於是平衡樹產生了 常見平衡樹 treap 比sbt慢,好寫吧 sbt 快,比較好寫,有些功能不支援 splay 特別慢,複雜度當做根號n來用,功能強大,不好寫 rbt 紅黑樹,特別快 替罪羊樹,朝鮮樹 晚上要講的不旋轉平衡樹 節點的左兒子中的每乙個一定比他小,右兒子中的...
無旋treap學習小記
高一才學這麼基本的平衡樹,退役了 鑑於旋轉treap不能可持久化,與splay相比除了常數小以外沒有什麼不同,所以就不學了。treap tree heap,即二叉搜尋樹 堆 它的中序遍歷是有序的,這是二叉搜尋樹的性質。且對於每乙個點有乙個隨機的鍵值,對於整個樹的任意一棵子樹,鍵值滿足堆的性質。基於隨...