zoukankan      html  css  js  c++  java
  • AC日记——【模板】Link Cut Tree 洛谷 P3690

    【模板】Link Cut Tree

    思路:

      LCT模板;

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    #define maxn 300005
    int n,m,val[maxn];
    int top,ch[maxn][2],f[maxn],xr[maxn],q[maxn],rev[maxn];
    inline void in(int &now)
    {
        int if_z=1;now=0;
        char Cget=getchar();
        while(Cget>'9'||Cget<'0')
        {
            if(Cget=='-') if_z=-1;
            Cget=getchar();
        }
        while(Cget>='0'&&Cget<='9')
        {
            now=now*10+Cget-'0';
            Cget=getchar();
        }
        now*=if_z;
    }
    inline void updata(int now)
    {
        xr[now]=xr[ch[now][0]]^xr[ch[now][1]]^val[now];
    }
    inline void downdata(int now)
    {
        int l=ch[now][0],r=ch[now][1];
        if(rev[now])
        {
            rev[l]^=1,rev[r]^=1,rev[now]^=1;
            swap(ch[now][0],ch[now][1]);
        }
    }
    inline bool isroot(int now)
    {
        return ch[f[now]][0]!=now&&ch[f[now]][1]!=now;
    }
    inline void rotate(int now)
    {
        int fa=f[now],ffa=f[fa],l,r;
        if(ch[fa][0]==now) l=0;else l=1;r=l^1;
        if(!isroot(fa))
        {
            if(ch[ffa][0]==fa) ch[ffa][0]=now;
            else ch[ffa][1]=now;
        }
        f[now]=ffa,f[fa]=now,f[ch[now][r]]=fa;
        ch[fa][l]=ch[now][r],ch[now][r]=fa;
        updata(fa),updata(now);
    }
    inline void splay(int now)
    {
        top=1,q[top]=now;
        for(int i=now;!isroot(i);i=f[i]) q[++top]=f[i];
        for(int i=top;i;i--) downdata(q[i]);
        while(!isroot(now))
        {
            int fa=f[now],ffa=f[fa];
            if(!isroot(fa))
            {
                if((ch[fa][0]==now)^(ch[ffa][0]==fa)) rotate(now);
                else rotate(fa);
            }
            rotate(now);
        }
    }
    void access(int now)
    {
        for(int t=0;now;t=now,now=f[now])
        {
            splay(now);
            ch[now][1]=t;
            updata(now);
        }
    }
    void makeroot(int now)
    {
        access(now);
        splay(now);
        rev[now]^=1;
    }
    int find(int now)
    {
        access(now);
        splay(now);
        while(ch[now][0]) now=ch[now][0];
        return now;
    }
    void split(int x,int y)
    {
        makeroot(x);
        access(y);
        splay(y);
    }
    void cut(int x,int y)
    {
        split(x,y);
        if(ch[y][0]==x) ch[y][0]=0,f[x]=0;
    }
    void link(int x,int y)
    {
        makeroot(x);
        f[x]=y;
    }
    int main()
    {
        in(n),in(m);int op,x,y,xx,yy;
        for(int i=1;i<=n;i++) in(val[i]),xr[i]=val[i];
        while(m--)
        {
            in(op);
            if(op==0)
            {
                in(x),in(y),split(x,y);
                printf("%d
    ",xr[y]);
            }
            if(op==1)
            {
                in(x),in(y),xx=find(x),yy=find(y);
                if(xx!=yy) link(x,y);
            }
            if(op==2)
            {
                in(x),in(y),xx=find(x),yy=find(y);
                if(xx==yy) cut(x,y);
            }
            if(op==3)
            {
                in(x),in(y);
                access(x);
                splay(x);
                val[x]=y;
                updata(x);
            }
        }
    }
  • 相关阅读:
    js基础:关于Boolean() 与 if
    @@cursor_rows变量解析
    SQL Prompt
    google android sdk下载hoosts
    java环境配置
    Linux grep用法整理
    bash调试执行
    Vim常见快捷键汇总
    Linux查看磁盘块大小
    Linux Bash终端快捷键小结
  • 原文地址:https://www.cnblogs.com/IUUUUUUUskyyy/p/6984151.html
Copyright © 2011-2022 走看看