gitlab伺服器搭建及命令
阿新 • • 發佈:2022-05-27
最討厭和 splay 有關的任何東西了
構造
-
大概就是根據虛實鏈將原樹分成了一個個的 splay 維護
-
每一個 splay 維護的實際上是原樹的一條鏈
-
每個 splay 按照中序遍歷的節點在原樹中的深度嚴格遞增
-
每個節點有一個父親,每個父親只認自己的實兒子,也就是 splay 中的兒子,也就是認父不認子
access
inline void access(int x) {
for(int y=0;x;x=f[y=x]) {
splay(x);rson=y;pushup(x);
}
}
- 意思是將 \(x\)
inline void makeroot(int x) {
access(x);splay(x);pushr(x);
}
- 意思就是讓 \(x\) 做整個樹的根,將 \(x\) 轉上去後,此時 \(x\) 的深度是整個 splay 中最大的,那麼翻轉後 \(x\) 就是深度最小的,也就是根,同時意味著整棵樹的深度都要進行變化
inline int findroot(int x) { access(x);splay(x); while(lson) pushdown(x),x=lson; pushdown(x); splay(x); return x; }
- 找到 \(x\) 所在聯通塊的根編號
inline void split(int x,int y) {
makeroot(x);access(y);splay(y);
}
- 將 \(x\to y\) 的路徑提取出來,並且構成一顆 splay ,\(y\) 做根
inline void link(int x,int y) {
makeroot(x);
if(findroot(y)!=x) f[x]=y;
}
- 連線兩點
inline void cut(int x,int y) { makeroot(x); if(findroot(y)!=x || f[y]!=x || ch[y][0]) return ; f[y]=ch[x][1]=0; pushup(x); }
-
切斷兩點的之間邊
-
因為連線和切斷可能不保證合法,所以加了一些判斷