lct各类操作小记录

学习了一下lct,觉得access和splay都是小问题,背背板子都可以解决,那么就按照这两个基本操作,有很多不同的转换,很多实际运用。

access:使它到根节点上的边都为重边,且与它的重儿子切断

No.1 move_to_root(x),将x设为原树的根,将x到根上的点形成一棵splay,但是此时x只是辅助树的根,所以要将它变为原树的根,只需将它们的深度全部反调,然后就可以了。

void move_to_root(int x)
{
    access(x);
    splay(x);
    reverse(x);
}

No.2 find_root(x),找到x在辅助树中的根,这个比较好理解,直接向上找就行了

No.3 link(x,y) (无向图)

void link(int x,int y)
{
    move_to_root(x);
    fa[x]=y;
}

No.4 cut(x,y) 将x变到主树的根中,然后将y access+splay

void cut(int x,int y)
{
    move_to_root(x);
    access(y);
    splay(y);
    fa[x]=0;
    c[y][0]=0;
}

No.5 链上修改,及要使一条链上的节点恰好在一个splay中

void split(int x,int y)
{
    move_to_root(y);
    access(x);
    splay(x);
}

x->y上所有路径都在以x为子树的树中,只需要对y打个标记即可

 

posted @ 2016-02-04 22:05  溪桥,吾愿  阅读(354)  评论(0编辑  收藏  举报