笔记:LCT的扩展应用

LCT 的一些扩展应用

发明 LCT 的人真是个天才!

基础的 LCT 用于维护生成森林,但其实可以扩展出更多的应用(会慢慢更新)。

基环树

LCT 是无法维护环结构的,但由于基环树只有一个环的特点,由以下方法维护有向基环树(以内向树为例):

  1. 若当前树没有环,则直接维护,将根设置为任意节点。
  2. 若有环,则在环上任选一个节点作为根,不在 LCT 中插入根节点指向的边(也就是当成树维护),同时维护一个辅助边表示该虚边。

注意此时的 LCT 是定根的,不能随意的变换根节点。

现在假定所有的边修改操作为更改一个点的出边,分为删边和加边两部分。

对于删边,判断该点是否在环内,找到当前树的根和虚边,做 access 将环打通,此时判断该点的辅助树的根是否是根节点即可(这里找的是 Splay 的根,不是原树的根)。

若在环内,删除该边,并将维护的虚边插入 LCT ,并以当前点位根,否则直接删除。当该点本身就是根节点时,直接删除虚边。

对于加边,此时该点一定是根节点,判断加边是否在原树中,若是则构成环,维护虚边即可。若不是,做正常的加边操作即可。

时刻注意虚边永远跟着根节点,改变虚边时要相应改变根节点。

例题:电子木鱼

题目不描述了,直接说做法:

把集合状压,那么加功德就是全局对 \(d\) 异或,由于是全局操作,可以维护当前异或的值是什么设为 \(T\) ,当一个 \(S_i=T\) 时,就会产生一次操作改变 \(T\) ,对于相同的 \(S_i\) ,只会操作编号最小的,因此每个状态 \(T\) 对应了唯一的出边。

转成图论问题后,加一个佛祖即选择一个没有出边的点选一个二进制差 \(1\) 位的点连接一条出边,原文题变成在若干次操作后,从 \(0\) 出发能走到环上。

  • \(0\) 本身能走到环,答案为 \(0\)
  • \(0\) 所在连通块大小大于 \(1\) ,则答案为 \(1\)
  • 否则,考虑所有状态只有 \(1\) 位的点,若存在某点能走到环,答案位 \(1\)
  • 以上情况都不满足,答案为 \(2\)

我们从大到小枚举 \(l\) ,求出最小的 \(r_1\) 满足加入 \([l,r_1]\) 边后,\(0\) 能走到环上。

再找出最小的 \(r_2\) ,满足加入 \([l,r_2]\) 边后,要不状态 \(1\) 位的某点能走到环,要不有边和 \(0\) 连通了,此时对于 \(r\in[l,r_2-1]\) 答案为 \(2\),对于 \(r \in [r_2,r_1-1]\) 答案为 \(1\),其余为 \(0\)

我们加入所有 \([l,n]\) 的边,考虑求出一个点到环上所有点的路径中边的编号最大的编号,发现这就是我们需要的 \(r\) ,对于 \(r_2\) 直接求,对于 \(r_1\) 就是对不同的点的路径最大值取最小,对于本身没有环的点来说,其值可以简单设为 \(n+1\)

我们发现只需要维护动态加边删边,路径最大值即可,扩展成基环树即可。

还要保证没有边和 \(0\) 连通,用 set 维护即可,注意有删边操作,不能直接用 las 记录,要记录所有的边。

注意找环上最值的时候,要把整个环拿出来判一遍,时刻注意虚边是没有加入 LCT 的,我们维护的任然是一棵树,具体方法把虚边的出点 access 上来即可。

代码

洛谷好像不能直接看代码,那就自己动手写写吧。

双倍经验,直接考虑不取模加强版,维护环长总和,连通块数量,比上一题好维护。

posted @ 2025-05-10 20:50  蒻蒻虫  阅读(12)  评论(0)    收藏  举报