Treap 普通平衡樹

2021-07-27 18:08:01 字數 1371 閱讀 6575

最近學習了treap,找了道題目做做 全抄hz...

因為普通的二叉樹,會退化成鏈;

所以你把讀入打亂順序再構造二叉樹,就明顯卡不掉;

平平均深度logn;

treap就是這樣的;

在插入乙個數時,我們搞乙個rnd,賦值隨機;

然後如果當前的這個節點rnd小於其父節點,那麼就把他轉到父節點的位置;

這樣好比是給這個節點乙個隨機的順序;

那麼即使毒瘤出題人把一開始資料的順序搞特殊,故意要卡你,因為每個資料有了這麼乙個隨機位置,相當於把讀入打亂啦,所以卡不掉;

要是被卡了是rp問題;

這裡我們要把3節點轉到上面來;

我們發現轉好之後幾個數字的再二叉樹裡的大小關習是不變的;

這就是我們轉的原理;

可以看出2-1|||||||||3-5這兩條邊是不變的;

自己感受感受;

其實轉就是怎麼個過程,換了種方式儲存資訊;

但轉就把3節點向上移動了;

**

#include

#include

#include

#include

#include

using namespace std;

struct treaptr[100005];

intm,x,y,z,root,size;//root是根節點,根節點不一定是1,因為會轉掉的;size就個計數

void now(int k)//更新size

void lturn(int &k)

void rturn(int &k)

void insert(int &k,int

x) tr[k].size++;

if(tr[k].v==x)//如果已經出現過直接加再w上

if(tr[k].v

}void del(int &k,int

x)//如果有多個那刪乙個

if(tr[k].l*tr[k].r==0)//這個是有乙個節點和無節點的情況

int l=tr[k].l,r=tr[k].r;

if(tr[l].rnd

del(k,x);

return;

}tr[k].size--;

if(tr[k].v

}int rank(int k,int

x)int num(int k,int

x)int pro(int k,int

x)int

sub(int k,int x)

int main()

}

treap 普通平衡樹

插入數值x。刪除數值x 若有多個相同的數,應只刪除乙個 查詢數值x的排名 若有多個相同的數,應輸出最小的排名 查詢排名為x的數值。求數值x的前驅 前驅定義為小於x的最大的數 求數值x的後繼 後繼定義為大於x的最小的數 注意 資料保證查詢的結果一定存在。輸入格式 第一行為n,表示操作的個數。接下來n行...

模板 普通平衡樹 Treap

題目描述 您需要寫一種資料結構 可參考題目標題 來維護一些數,其中需要提供以下操作 1.插入x數 2.刪除x數 若有多個相同的數,因只刪除乙個 3.查詢x數的排名 排名定義為比當前數小的數的個數 1。若有多個相同的數,因輸出最小的排名 4.查詢排名為x的數 5.求x的前驅 前驅定義為小於x,且最大的...

1004 treap 普通平衡樹

繼續平衡樹 描述 插入x數 刪除x數 若有多個相同的數,因只刪除乙個 查詢x數的排名 若有多個相同的數,因輸出最小的排名 查詢排名為x的數 求x的前驅 前驅定義為小於x,且最大的數 求x的後繼 後繼定義為大於x,且最小的數 輸入 第一行為n,表示操作的個數,下面n行每行有兩個數opt和x,opt表示...