码迷,mamicode.com
首页 > 其他好文 > 详细

AC日记——【模板】Link Cut Tree 洛谷 P3690

时间:2017-06-11 10:15:31      阅读:120      评论:0      收藏:0      [点我收藏+]

标签:down   pre   return   line   split   include   ble   log   oid   

【模板】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\n",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);
        }
    }
}

 

AC日记——【模板】Link Cut Tree 洛谷 P3690

标签:down   pre   return   line   split   include   ble   log   oid   

原文地址:http://www.cnblogs.com/IUUUUUUUskyyy/p/6984151.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!