LCT细节注意

LCT的题目中经常会遇到旋根操作,那么就要打一个翻转标记,这样就会引起很多问题。

Splay的双旋

Splay必须要处理好标记下传的问题,不然由于双旋的特殊性很容易造成问题。一种比较方便的操作方式是在Splay(u)之前先把u的所有父亲的标记都下传。

void Splay(int u)
    {
        int top = 0;
        for(int i = u;i;i = T[i].fa) Sta[++ top] = i;
        for(;top;top --) Lazy_down(Sta[top]);
        for(;T[u].fa;)
        {
            int fa = T[u].fa,ft = T[fa].fa;
            if (!ft) Rotate(u,T[fa].son[1] == u); else
            {
                if (T[fa].son[1] == u)
                {
                    if (T[ft].son[1] == fa) Rotate(fa,1),Rotate(u,1); else
                        Rotate(u,1),Rotate(u,0);
                } else
                    if (T[ft].son[0] == fa) Rotate(fa,0),Rotate(u,0); else
                        Rotate(u,0),Rotate(u,1);
            }
        }
        Update(u);
    }

Link(u,v)

Link之前先判断u,v是否联通。然后必须Make_Root(v)。


    bool link(int u,int v)
    {
        if (Root(u) == Root(v)) return 0;
        Evert(v),Splay(v),Par[v] = u,Access(v);
        return 1;
    }

Delete(u,v)

先判联通,然后判是否相连。

bool cut(int u,int v)
    {
        if (Root(u) != Root(v)) return 0;
        Evert(u);Access(v);Splay(v);
        if (T[v].son[0] != u || T[u].son[1]) return 0;
        T[v].son[0] = 0,T[u].fa = 0;Par[v] = 0;
        Update(v);
        return 1;
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值