平衡樹是一種很玄學的操作,這裡提供兩種基本模板
指標模板:
這裡寫**片
#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...