它基本的支援一下操作:
1. 插入x數
2. 刪除x數(若有多個相同的數,只刪除乙個)
3. 查詢x數的排名(若有多個相同的數,輸出最小的排名)
4. 查詢排名為x的數
5. 求x的前驅(前驅定義為小於x,且最大的數)
6. 求x的後繼(後繼定義為大於x,且最小的數)
模板如下:
#include
#include//有rand()[隨機函式]
#include
using
namespace
std;
struct treap
t[1000010];
int tot,m,root,ans;
inline
void update(int k)
//&k:節點編號
inline
void ll(int &k)
inline
void rr(int &k)
void insert(int &k,int num)
++t[k].size;
if(t[k].v==num) ++t[k].recy;
else
if(t[k].vif(t[t[k].r].rndelse
if(t[k].l*t[k].r==0) k=t[k].l+t[k].r;
else
if(t[t[k].l].rndelse ll(k),delet(k,num);
}else
if(num>t[k].v) --t[k].size,delet(t[k].r,num);
else --t[k].size,delet(t[k].l,num);
}int atrank(int k,int num)//尋找值為num的數的排名
int rerank(int k,int num)//尋找排名為num的數值
void pre(int k,int num)//找前驅
else pre(t[k].l,num);
}void suc(int k,int num)//找後繼
int main()
if(f==6)
}return
0;}
來道題:
bzoj1503 [noi2004]鬱悶的出納員
#include
#include
#include
using
namespace
std;
const
int maxn=100020;
int s[maxn],l[maxn],r[maxn],v[maxn],tot=0,rnd[maxn],n,m,pre,root,ans;
inline
void pushup(int k)
inline
void rturn(int &k)
inline
void lturn(int &k)
void ins(int &k,int num)
s[k]++;
if(numif(rnd[l[k]]else
else
}int find(int k,int x)
int main()
if(ch[0]=='f')
} printf("%d\n",ans);
return
0;}
以及poj2892『』鬼子進村『』(我同桌這樣叫的)
#include
#include
//#include
using
namespace
std;
int tot=0,n,m,root,l,r,last[60000],pop=0;
struct treap
t[60000];
inline
void update(int k)
inline
void ll(int &k)
inline
void rr(int &k)
void insert(int &k,int num)
t[k].size++;
if(num==t[k].v) t[k].recy++;
else
if(numif(t[k].rnd>t[t[k].l].rnd) rr(k);
}else
}void delet(int &k,int num)
else
if(t[k].l*t[k].r==0) k=t[k].l+t[k].r;
else}}
else
if(numelse --t[k].size,delet(t[k].r,num);
}void find(int k,int num)
if(c[0]=='r')
if(c[0]=='q')
}}int main()
隨機二叉搜尋樹 Treap
當個日記記錄treap這一結構,詳細參見http www.nocow.cn index.php treap,在這裡我著重講一下旋轉 treap,它其它就是乙個二叉查詢樹 bst 堆 heap 它的資料有兩個 關鍵值 key 優先順序 fix 用struct表示treap的結點的結構如下 struct...
動態平衡二叉搜尋樹的簡易實現,Treap 樹
treap 樹是一種易於實現的近似平衡的二叉搜尋樹。treap 每個結點包括值和優先順序兩個屬性,值滿足二叉搜尋樹性質 左 中 右 優先順序滿足大頂堆的性質 左 中 右 中 treap 樹的插入和刪除的實現比較簡單,插入結點時為待插結點隨機生產乙個優先順序值,按照bst的插入演算法並通過左旋或右旋調...
平衡二叉搜尋樹
二叉搜尋樹的問題 平衡 banlance 平衡 當節點數量固定時,左右子樹的高度越接近,這棵二叉樹就越平衡 高度越低 最理想的狀態就是像完全二叉樹 滿二叉樹那樣,高度是最小的。前提 節點的新增 刪除順序是無法限制的,可以認為是隨機的。改進方案 在節點的新增 刪除操作之後,想辦法讓二叉搜尋樹恢復平衡 ...