在多次學習splay後,我終於理解並碼出了整份**
參考了的部落格
#includeusingnamespace
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的後繼 後...