模板篇 伸展樹Splay Tree(此坑待填)

2021-07-29 20:55:04 字數 2351 閱讀 2106

已填坑: 請移步…

splay?伸展。

splay tree?伸展樹。

遇事不決問度娘。。

從前,有種東西叫bst(binary search tree,二叉查詢樹),各位都聽說過吧?

此bst能較為高效的查詢資料。。(所以是查詢樹嘛)

而它卻有乙個致命的缺點!常常會被卡成一條鏈。。

不是鏈的時候樹也會很高。。。。效率很難維持住o(nlogn)

所以,人們研究了各種的二叉平衡樹,通過對bst各種姿勢的調整維護樹的左右平衡,使樹高不會太高,從而防止效率退化。。

splay是其中的一種(然而還是會被卡)。。在省選這個階段似乎是夠用了。。

splay有很多操作,其中最重要的,當然是splay..

splay在維護資訊時,會將各種東西伸展到根上,

(扭來扭去的),這也就是splay樹名字的由來了吧。。

先把板子丟上來…

#include 

const

int maxq=0x186af;

const

int inf=~0u>>2;

#define gc getchar()

#define xx(x) printf("%d\n",x)

inline

int gnum()

inline

int max(const

int &a,const

int &b)

inline

int min(const

int &a,const

int &b)

struct splaypool[maxq],*rt,*null;

void splay::update()

int splay::get_wh()

void splay::set_ch(int wh,splay *child)

int tot=0;

inline splay* new(int val)

void init()

inline

void rotate(splay *&now)

inline

void splay(splay *now,splay *tar)

inline splay* find(int val)

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

return now;

}void ins(int val)

if(nnow->valval) now=now->ch[0];

else now=now->ch[1];

}if(last==now) rt=nnow;

else

if(nnow->valval) last->set_ch(0,nnow);

else last->set_ch(1,nnow);

splay(nnow,null);

}void del(int val)

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

else

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

now->ch[0]->fa=null,rt=now->ch[0];

else

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

now->ch[1]->fa=null,rt=now->ch[1];

else

}inline

int pre(int val)

inline

int nxt(int val)

inline

int rnk(int val)

if(valval) now=now->ch[0];

else ls+=now->cnt+now->ch[0]->sz,now=now->ch[1];

}return -1;

}//inline int rnk(int val)

// if(valval) now=now->ch[0];

// else ls+=now->ch[0]->sz+now->cnt,now=now->ch[1];

// }

// return -1;

//}inline

int pos(int k)

if(k<=x) now=now->ch[0];

else ls=x+now->cnt,now=now->ch[1];

}return -1;

}int main()

}}

高階資料結構 伸展樹(Splay Tree)

伸展樹 splay tree 是一種二叉搜尋樹,它能在o log n 內完成插入 查詢和刪除操作。它由daniel sleator和robert tarjan創造。它的優勢在於不需要記錄用於平衡樹的冗餘資訊。在伸展樹上的一般操作都基於伸展操作。各種二叉搜尋樹存在不足。比如 對於乙個有n個節點的平衡二...

伸展樹模板

include include include include define key value ch ch root 1 0 using namespace std const int maxn 200000 10 char op maxn 10 int opx maxn int s maxn e...

伸展樹模板

給定乙個數n,代表有乙個數列1 n,有下面兩種操作 cut a b c 把區間 a,b 這一段元素切下來接到新序列第c個元素的後面 flip a b 反轉區間 a,b 最後遍歷整個序列 define key val son son root 1 0 typedef long long ll cons...