Treap總結與模板

2021-08-28 16:26:43 字數 1269 閱讀 6730

支援插入,刪除,區間第k大,乙個數的前驅,後繼...

核心的思想:

每個節點有乙個key表示該節點的值

和乙個priority 表示當前節點的優先值

我們的樹既滿足二叉查詢樹的左小右大

右滿足堆的上小下大

這樣一來,均攤複雜度可以達到logn

在插入時,只要不滿足堆的性質就旋轉

在刪除時,我們找到要刪除的點,並將它旋轉到葉子節點

在旋轉時也要注意優先值

type為0是右旋,1是左旋

void rotate(int &o,int type)

void insert(int &o,int val)

t[o].size++;

if(t[o].key==val)

if(val1)

if(t[o].ch[0]==0) o=t[o].ch[1];

else if(t[o].ch[1]==0) o=t[o].ch[0];

else

else pre(t[o].ch[0],x);

}void suf(int o,int x)t[n];

int n,root,ans,tot;

int read()

while(isdigit(ch))cnt=cnt*10+(ch-'0'),ch=getchar();

return cnt*f;

}inline int randon()

void update_size(int o)

void rotate(int &o,int type)

void insert(int &o,int val)

t[o].size++;

if(t[o].key==val)

if(val1)

if(t[o].ch[0]==0) o=t[o].ch[1];

else if(t[o].ch[1]==0) o=t[o].ch[0];

else

else pre(t[o].ch[0],x);

}void suf(int o,int x)

else suf(t[o].ch[1],x);

}int main()

return 0;

}

Treap 基礎模板

treap是擁有鍵值和優先順序兩種權值的樹 對於鍵值而言它是排序二叉樹 對於優先順序而言它是堆 struct node 旋轉操作 d 0 代表左旋,d 1 代表右旋 技巧性較強,d 1等價於1 d 因為d就是0或1 o是指向乙個treap節點的指標,本身可以修改所以是引用 void rotate n...

平衡樹模板 Treap

演算法標籤 treap 種下第一棵平衡樹 這是一道模板題。如果覺得這個題水的可以做一下4544壓行,是千古神犇花爸爸出的神犇題。您需要寫一種資料結構 可參考題目標題,但是這句話其實並沒有什麼用233 來維護一些數,其中需要提供以下操作 1.插入x數 2.刪除x數 若有多個相同的數,因只刪除乙個 3....

模板 普通平衡樹 Treap

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