splay 普通平衡樹

2022-09-08 00:09:24 字數 2643 閱讀 3787

平衡樹是一種很玄學的操作,這裡提供兩種基本模板

指標模板:

這裡寫**片

#include

#include

#include

#include

#include

#include

using namespace std;

const

int inf=1e9;

const

int max_q = 1e5 + 10;

int n,top=0;

struct node

int get_wh()

void set_ch(int wh,node *child);

}pool[max_q],*root,*null;

void node::set_ch(int wh,node *child) //建兒子 *取位址符,變參

inline node *get_new(int v)

inline void rotate(node *&now)

inline void splay(node *now,node *tar)

void insert(int v) //插入

else

if (newone->vv) //以權值為維護小根堆的標準

now=now->ch[0];

else

now=now->ch[1];

}if (last==null) //樹為空

root=newone;

else

return;

}inline node *find(int v)

if (now!=null) splay(now,null);

return now;

}inline void del(int v)

if (now->ch[0]==null&&now->ch[1]==null)

root=null;

else

if (now->ch[1]==null)

else

if (now->ch[0]==null)

else

return;

}inline int pre(int v)

return ans;

}inline int nxt(int v)

return ans;

}inline int get_rank(int v)

if (vv)

now=now->ch[0];

else

left+=now->ch[0]->size+now->cnt,now=now->ch[1];

}return -1;

}inline int kth(int k)

if (k<=_)

now=now->ch[0];

else

left=_+now->cnt,now=now->ch[1]; //先前計算的_就已經累加了left,所以這裡一定是"="

}return -1;

}int main()

}return

0;}

陣列模板:

這裡寫**片

#include#include#includeusing namespace std;

const int n=1000010;

int ch[n][2],pre[n],size[n],v[n],cnt[n];

int top=0,root=0;

int n;

void clear(int bh)

int get(int bh)

void update(int bh)

return;

}void rotate(int bh)

void splay(int bh,int mb)

void insert(int x)

while (1)

fa=now;

now=ch[now][v[now]if (now==0)

}}int find(int x) //查詢排名

ans+=cnt[now];

now=ch[now][1];}}

}int findx(int x) //查詢值

}}int qian(int x)

else now=ch[now][0];

}return ans;

}int hou(int x)

else now=ch[now][1];

}return ans;

}int fro()

void del(int x)

if (!ch[root][0]&&!ch[root][1])

if (!ch[root][0])

if (!ch[root][1])

int wh=fro();

int k=root;

splay(wh,0);

ch[root][1]=ch[k][1];

pre[ch[k][1]]=root;

clear(k);

update(root);

return;

}int main()

}return

0;}

Splay 普通平衡樹模板

口訣 rotate 先上再下,最後自己 splay 祖父未到旋兩次,三點一線旋父親,三點折線旋自己。delete 沒有兒子就刪光。單個兒子刪自己。兩個兒子找前驅。易錯點 rotate 祖父不在自己做根 delete 自己做根父親為0 kth 先減排名後轉移 by dennyqi 2018 inclu...

學習筆記 普通平衡樹Splay

哈哈哈哈哈哈哈終於會打 splay 啦 現在我來發一下 splay 的講解吧 小蒟蒻由於碼風與他人不同,所以自己找了上百篇碼風詭異的 splay 合成的,感謝 zcysky 的 與我碼風相近,讓我看懂了 首先,splay 其實就是把一棵二叉搜尋樹變成一棵深度不會超過 logn 的二叉搜尋樹,它在不斷...

BZOJ3224 普通平衡樹 splay

題目在這裡 題意 讓你實現一棵樹,實現 插入,刪除,查詢x數的排名,查詢排名為x的數 求x的前驅 前驅定義為小於x,且最大的數 求x的後繼 後繼定義為大於x,且最小的數 這道題最開始我用treap過了,今天打了乙個splay題解。treap題解 include include include usi...