普通平衡樹 lg3369

2022-05-30 09:21:08 字數 1694 閱讀 1335

在多次學習splay後,我終於理解並碼出了整份**

參考了的部落格

#includeusing

namespace

std;

#define inf 0x3f3f3f3f

#define ls st[p].ch[0]

#define rs st[p].ch[1]inline

intread()

while(ch>='

0'&&ch<='9'

)

return w*f;

} int

n,m,cnt,tot,root;

struct

nodest[

1000010

];//val表示當前值,cnt表示出現次數,sum表示包括自己在內的子樹大小,ch[0]為左兒子,ch[1]為右兒子

inline

void push_up(int

x)//上推,子樹大小為左子樹加右子樹加自身

inline

void connect(int x,int fa,int

son)//重新連線父子節點

inline

bool identify(int

x)//判斷自己是左兒子還是右兒子

inline

void rotate(int

x)//rotate的實現原理在上面那個部落格裡有詳細介紹

inline

void splay(int x,int

goal)

rotate(x);

}if(!goal) root=x;

return

;}//splay操作就是將節點向目標不斷旋轉

inline

void insert(int

x)

if(now)

else

st[now].ch[

0]=st[now].ch[1]=0

;//兒子連向父親

st[now].sum=st[now].cnt=1

; st[now].f=f;st[now].val=x;

}splay(now,

0);return

;//將當前節點旋轉到根

}inline

void find(int

x) splay(now,

0);return;}

inline

int next(int x,int

f)inline

void delete(int

x)

else

return;}

inline

int k_th(int

x)

else

if(st[lson].sum>=x)

else

return

st[now].val;//如果不屬於以上兩種情況就是在當前節點了

}}int

main()

if(opt==4

)

if(opt==5

)

if(opt==6

) }

return0;

}

普通平衡樹這道題大概就是這樣了,接下來會跟進有關題目的訓練及題解。

Luogu 3369 普通平衡樹

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

luogu3369 普通平衡樹

題目鏈結 模板只是有幾個容易出錯的地方 第45行容易忘記 第54行裡面的cnt 和siz 容易忘記 第56行是根據id判斷不是val 第60行siz 容易忘記 第64行是siz 1不是siz cnt 第77行和82行等於的情況容易忽略 include include include include ...

洛谷 3369 模板 普通平衡樹

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