插入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,...