支援插入,刪除,區間第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,且最大的...