這又是洛谷平衡樹的模板題...
[sbt的寫法]
treap的**很短,只是在普通二茬查詢樹的插入操作和刪除操作中加入維護堆性質的rotate,
形式也和堆很像,插入時將新節點不斷向上抬,刪除時將節點向下降直至彈出.
隨機種子的選取可以用一些玄學的方法(來自網上某位大佬)
inline int random()
而rotate操作可以通過將孩子陣列設為ch[2]簡化成乙個
void rotate(int &t,int d)
於是**就特別短
#include#define n 100005
int root,val[n],ch[n][2],rnd[n],w[n],size,cnt;
inline int random()
void rotate(int &t,int d)
void insert(int &t,int v)
w[t]++; int d=v>val[t];
insert(ch[t][d],v);
if(rnd[ch[t][d]]val[t]],v);
if(t) w[t]=w[ch[t][0]]+w[ch[t][1]]+1;
}int select(int k)
return val[t];
}int rank(int v)
return ret+1;
}int pre(int v)
return val[ret];
}int suc(int v)
return val[ret];
}int main()
}}
Treap 普通平衡樹
最近學習了treap,找了道題目做做 全抄hz.因為普通的二叉樹,會退化成鏈 所以你把讀入打亂順序再構造二叉樹,就明顯卡不掉 平平均深度logn treap就是這樣的 在插入乙個數時,我們搞乙個rnd,賦值隨機 然後如果當前的這個節點rnd小於其父節點,那麼就把他轉到父節點的位置 這樣好比是給這個節...
treap 普通平衡樹
插入數值x。刪除數值x 若有多個相同的數,應只刪除乙個 查詢數值x的排名 若有多個相同的數,應輸出最小的排名 查詢排名為x的數值。求數值x的前驅 前驅定義為小於x的最大的數 求數值x的後繼 後繼定義為大於x的最小的數 注意 資料保證查詢的結果一定存在。輸入格式 第一行為n,表示操作的個數。接下來n行...
模板 普通平衡樹 Treap
題目描述 您需要寫一種資料結構 可參考題目標題 來維護一些數,其中需要提供以下操作 1.插入x數 2.刪除x數 若有多個相同的數,因只刪除乙個 3.查詢x數的排名 排名定義為比當前數小的數的個數 1。若有多個相同的數,因輸出最小的排名 4.查詢排名為x的數 5.求x的前驅 前驅定義為小於x,且最大的...