r es
ul
tresult
result
h yp
erli
nk
hyperlink
hyperl
ink de
scri
ptio
ndescription
descri
ptio
n 寫一種資料結構維護一些資料
包括插入,查詢,刪除,查詢前驅,查詢後繼等
s ol
utio
nsolution
soluti
on好久之前扣tre
ap
treap
trea
p過了這道題,後來坐我旁邊那位大佬寫了替罪羊樹,趕緊去%%%,終於%到了這篇題解
c od
ecode
code
#include
#include
#include
using
namespace std;
struct nodet[
2000001];
int nc[
2000001
],cz[
2000001
],root,lnc,lcz,buildwho,x,opt,m;
inline
char
getchar()
return
*p1++;}
inline
long
long
read()
inline
void
write
(register
long
long x)
inline
bool
isbad
(int k)
//是否需要重構
void
dfs(
int k)
//中序遍歷
void
build
(int l,
int r,
int&k)
//建樹
if(l
build
(l,mid-
1,t[k]
.lson)
;else t[k]
.lson=0;
build
(mid+
1,r,t[k]
.rson)
; t[k]
.total=t[t[k]
.lson]
.total+t[t[k]
.rson]
.total+1;
t[k]
.valid=t[t[k]
.lson]
.valid+t[t[k]
.rson]
.valid+1;
return;}
inline
void
rebuild
(int
&k)//重建
inline
intfind_rank
(int k)
//查詢k的排名
}return ans;
}inline
intfind_kth
(int k)
//查詢排名為k的數
}return-1
;}void
insert
(int
&k,int x)
//插入
t[k]
.total++
;t[k]
.valid++;if
(t[k]
.val>=x)
insert
(t[k]
.lson,x)
;else
insert
(t[k]
.rson,x);if
(isbad
(k))
rebuild
(k);
//不平衡則重構
}void
delet_pos
(int
&k,int x)
//刪除排名為x的數
t[k]
.valid--;if
(t[t[k]
.lson]
.valid+t[k]
.ok>=x)
delet_pos
(t[k]
.lson,x)
;else
delet_pos
(t[k]
.rson,x-
(t[t[k]
.lson]
.valid+t[k]
.ok));
return;}
void
delet_val
(int x)
//刪除這個數
signed
main()
}
P3369 模板 普通平衡樹
題目描述 您需要寫一種資料結構 可參考題目標題 來維護一些數,其中需要提供以下操作 1 插入x數 2 刪除x數 若有多個相同的數,因只刪除乙個 3 查詢x數的排名 排名定義為比當前數小的數的個數 1。若有多個相同的數,因輸出最小的排名 4 查詢排名為x的數 5 求x的前驅 前驅定義為小於x,且最大的...
P3369 模板 普通平衡樹
aimee 考試前看到某份考綱提到了平衡樹 突發奇想想學乙個 但是來不及了,為了平衡學習時間,以及大佬的建議下,毅然決定用vector搞乙個 額,要是vector都過不了,那以我的水平,也拿不到更多的分了 配方,lower bound upper bound vector 對於操作1,使用vecto...
P3369 模板 普通平衡樹
這道題最簡單的解法 權值線段樹。下面的程式為了方便大家理解沒有離散化哦。操作 i ii 插入 刪除 x 數procedure change l,r,k,key,add longint var mid longint begin inc tree k add if l r then exit mid ...