• LCT手写


    LCT 42行模板。但是我主要凭记忆打的,没有对std,所以可能有的地方错了。回来要对一下std。

    注意4个up,分别是rotate,splay,access,cut.

    (uo维护链上信息,link不会合为一条链,所以不用up).

    19,10,04.

    #include<bits/stdc++.h>
    #define F(i,a,b) for(int i=a;i<=b;++i)
    #define LL long long
    #define pf(a) printf("%d ",a)
    #define phn puts("")
    using namespace std;
    #define lc ch[x][0]
    #define rc ch[x][1]
    int nroot(int x){return ch[f[x]][0]==x||ch[f[x]][1]==x;}
    void pushr(int x){r[x]^=1;swap(lc,rc);}
    void pushdown(int x){if(r[x]){if(lc)push(lc);if(rc)push(rc);r[x]=0;}}
    void up(int x){w[x]=w[lc]+w[rc];}
    void rotate(int x){
        int y=f[x],z=f[y],k=ch[y][1]==x,w=ch[x][!k];
        if(nroot(y))ch[z][ch[z][1]==y]=x;ch[y][k]=w;ch[w][!k]=y;
        if(w)f[w]=y;f[x]=z;f[y]=x; up(y);
    }
    void splay(int x){
        int y=x,z;sta[top=1]=x;
        while(nroot(y))sta[++top]=y=f[y];
        while(top)pushdown(sta[top--]);
        while(nroot(x)){
            y=f[x],z=f[y];
            if(nroot(y))rotate((ch[y][1]==x)^(ch[z][1]==y)?x:y);
            rotate(x);
        }up(x);
    }
    void access(int x){for(int y=0;x;x=f[y=x])splay(x),rc=y,up(x);}    
    int findroot(int x){
        access(x);splay(x);
        while(lc)pushdown(x),x=lc; return x;
    }
    void makeroot(int x){access(x);splay(x);pushr(x);}    
    void split(int x,int y){makeroot(x);access(y);splay(y);}
    void link(int x,int y){
        makeroot(x);
        if(findroot(y)!=x)f[x]=y;
    }
    void cut(int x,int y){
        makeroot(x);
        if(findroot(y)==x&&f[y]==x&&!ch[y][0])f[y]=ch[x][1]=0;up(x);
    }
    int main(){
    
    }
    View Code
  • 相关阅读:
    《疯狂的程序员》二
    《当程序员的那些狗日日子》五
    《疯狂的程序员》九
    《疯狂的程序员》一
    《疯狂的程序员》三
    和菜鸟一起学算法之递归和分治简单实例
    《疯狂的程序员》八
    《当程序员的那些狗日日子》四
    开放源代码软件利润高于专有代码
    少年黑客破解Google视频播放器
  • 原文地址:https://www.cnblogs.com/seamtn/p/11623405.html
Copyright © 2020-2023  润新知