洛谷P3369 模板 普通平衡樹 Treap

2021-09-25 15:27:40 字數 1809 閱讀 7383

插入xxx數

刪除x

xx數(若有多個相同的數,因只刪除乙個)

查詢x

xx數的排名(排名定義為比當前數小的數的個數+1+1

+1。若有多個相同的數,因輸出最小的排名)

查詢排名為x

xx的數

求x

xx的前驅(前驅定義為小於x

xx,且最大的數)

求x

xx的後繼(後繼定義為大於x

xx,且最小的數)

總算學會敲tre

ap

treap

trea

p的模板的啊,感覺這樣下去菜的很快就要退役啊。

都上初三了才學會最基礎的平衡樹。

暑假也沒有怎麼刷題,真的是頹廢了啊。

維護一棵bst

bstbs

t,滿足任意節點的左子樹中的節點全部小於這個點,右子樹中的節點全部大於這個點。然後這樣就可以相對簡單的完成上述操作。

碼亮遠遠沒有我想象的那麼長,原本以為有200

+200+

200+

,結果只打了156

15615

6行,對於我這種碼風來說已經可以了。

注意為了保持bst

bstbs

t相對平衡,需要隨機旋轉bst

bstbs

t使得bst

bstbs

t深度較小。

#include

#include

#include

#include

#include

using

namespace std;

const

int n=

100010

,inf=

1e9;

int n,x,opt,root,tot;

struct treenode

;struct treap

void

update

(int x)

void

build()

void

zig(

int&x)

void

zag(

int&x)

void

insert

(int

&x,int val)

if(t[x]

.val==val)

if(val.val)

else

update

(x);

}void

del(

int&x,

int val)

if(t[x]

.lc || t[x]

.rc)

else x=0;

return;}

if(val.val)

del(t[x]

.lc,val)

;else

del(t[x]

.rc,val)

;update

(x);

}int

get_rank

(int x,

int val)

intget_val

(int x,

int rank)

intpre

(int x,

int val)

intnext

(int x,

int val)

}treap;

intmain()

return0;

}

洛谷P3369 模板 普通平衡樹

本蒟蒻最近剛剛學會平衡樹,特來寫篇部落格以加深印象。我的意思是若寫的不好望各位奆佬多多包含!插入 x 數 刪除 x 數 若有多個相同的數,因只刪除乙個 查詢 x 數的排名 排名定義為比當前數小的數的個數 1 若有多個相同的數,因輸出最小的排名 查詢排名為 x 的數 求 x 的前驅 前驅定義為小於 x...

洛谷P3369 模板 普通平衡樹

插入x數 刪除x數 若有多個相同的數,因只刪除乙個 查詢x數的排名 排名定義為比當前數小的數的個數 1。若有多個相同的數,因輸出最小的排名 查詢排名為x的數 求x的前驅 前驅定義為小於x,且最大的數 求x的後繼 後繼定義為大於x,且最小的數 輸入格式 第一行為n,表示操作的個數,下面n行每行有兩個數...

題解 洛谷 P3369 模板 普通平衡樹

splay是像我這樣的小蒟蒻一開始學的平衡樹。雖然splay常數不小,但是功能十分全面,既可以當區間樹也可以當平衡樹 當然這兩者不可兼顧 看到題解裡一堆dalao寫陣列,但是splay本來是應該用指標實現的 據說這樣常數會小很多 於是蒟蒻就開始寫起了指標splay。出人意料,陣列splay我一遍a,...