1. 程式人生 > 其它 >gitlab伺服器搭建及命令

gitlab伺服器搭建及命令

  • 最討厭和 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\)
    到當前的根的路徑打通,所有的邊都變成實邊,並且 \(x\) 為所在 splay 中深度最大的點
    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);
    }
  • 切斷兩點的之間邊

  • 因為連線和切斷可能不保證合法,所以加了一些判斷

Lg P3690 【模板】動態樹(Link Cut Tree)

參考程式碼