已填坑: 請移步…
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...