關於非旋轉treap的學習

2022-05-11 02:15:08 字數 2055 閱讀 4113

非旋轉treap的操作基於split和merge操作,其餘操作和普通平衡樹一樣,複雜度保證方式與旋轉treap差不多,都是基於乙個隨機的引數,這樣構出的樹樹高為\(logn\)

作用:將原平衡樹分為排名為\([1,k]\),\([k+1,n]\)的兩棵平衡樹

實現:1.如果\(x\)左兒子的子樹大小\(size[l]==k\),那麼\(x\)左兒子即為\([1,k]\)這個平衡樹的根,\(x\)本身為另一顆平衡樹的根

2.如果\(x\)左兒子的子樹大小\(size[l]+1==k\),那麼\(x\)為\([1,k]\)這個平衡樹的根,\(x\)右兒子為另一顆平衡樹的根

3.如果是上述情況,直接把左兒子或右兒子接上去就好

4.否則,遞迴處理,直到出現這兩種情況位置

inline void split(int x,int k,int &a,int &b)

int l=ch[x][0],r=ch[x][1];

if(sz[l]==k)ch[x][0]=0,a=l,b=x;

else if(sz[l]+1==k)ch[x][1]=0,a=x,b=r;

else if(sz[l]>k)split(l,k,a,ch[x][0]),b=x;

else split(r,k-sz[l]-1,ch[x][1],b),a=x;

upd(x);

}

作用:將兩棵平衡樹合併,合併後引數滿足\(heap\)的性質,且滿足平衡樹性質.

實現:我們強制\(merge(x,y)\)中\(x\)的所有節點的關鍵字都小於所有\(y\)的關鍵字,根據關鍵字合併即可.

inline int merge(int x,int y)

else

}

以\(x\)的前驅為界,拆原樹為兩棵樹,將左樹合併到\(x\),再將\(x\)合併到右樹

inline void ins(int x)
以\(x\)為界\(split\)原樹,刪除\(x\)後再合併左右子樹

inline void delet(int x)
只需在\(merge\),\(split\),\(kth\),\(rank\)函式前下放即可

#include #include #include #include #include #include #define rg register

#define il inline

#define iter iterator

#define max(a,b) ((a)>(b)?(a):(b))

#define min(a,b) ((a)<(b)?(a):(b))

using namespace std;

typedef long long ll;

const int n=100005;

int ch[n][2],sz[n],key[n],cnt=0,v[n],rt;

inline void upd(int x)

inline void split(int x,int k,int &a,int &b)

int l=ch[x][0],r=ch[x][1];

if(sz[l]==k)ch[x][0]=0,a=l,b=x;

else if(sz[l]+1==k)ch[x][1]=0,a=x,b=r;

else if(sz[l]>k)split(l,k,a,ch[x][0]),b=x;

else split(r,k-sz[l]-1,ch[x][1],b),a=x;

upd(x);

}inline int merge(int x,int y)

else

}inline int rank(int k)

return ret;

}inline int kth(int k)return 0;

}inline void ins(int x)

inline void delet(int x)

void work()

}int main()

Treap樹堆非旋轉演算法

核心操作 與合併 split 有兩種 按權值 與按位置 排名 如果按權值 split 那麼分出來兩棵樹的第一棵樹上的每個數的大小都小於 或者小於等於,視具體情況 x。如果按位置 split 那麼分出來兩棵樹的第一棵樹上恰好有x個結點。按權值 inline void split int k,int l...

非旋Treap 學習筆記

今天學習了一下非旋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...

非旋轉Treap 用執行時間換除錯時間的有效手段

啥意思?如果寫過splay和塊鏈,前者的除錯時間和後者的敲版子時間讓我們頭痛欲裂,但是這個平衡樹,好寫好調,省去了時間。但是常數相對較大,這便是我們的代價 好乙個時間換時間 treap就是tree heap,乙個基於堆的二叉搜尋樹,但是它的維護過程是仰仗於旋轉的。而我們今天講的非旋轉treap,顧名...