link-cut-tree

主要写一写今天写的两个题目总结。

  1. bzoj3779

重组病毒,首先看到他的操作相当于,lct换根,lct access。

于是我们观察,这个子树和用lct不好维护呀我去。

所以不要硬想lct了,不然NOI day1t1惨案了!!!!要先想性质!!!

发现这个颜色数,而且这个颜色是一段一段的,所以不难想到可以维护有几次转换颜色。

也就是lct虚边个数

于此引入lct为时不晚。。

那考虑lct access 复杂度是均摊单次 \(O(\log n)\) 的。所以我们暴力跳实链,更改虚实边,算更改产生的贡献。

发现由于链只有上下两种方向的,所以权值改变的点一定在 dfs 序上的一个区间。。。然后线段树?线段树。。。。。

然后只需要找到这条实链上“下一个”(更浅的点即可),这样splay随便坐一坐即可。

我本来很是疑惑可不可以不用lct,但是发现换根操作真的太麻烦了,所以有换根操作时“适当”考虑lct是可以的。

总结:

  1. lct进行splay操作时一定要pushdown。

  2. 实链虚链(除了最后那条)都是直上直下的。(存疑)

  3. 最后一点,切记,在树的形态没有发生改变时(除了换根)千万不要随便想lct,现在我看NOI2021 day1t1已经有点想lct了。切记切记。

  4. 另外,当跳需要实链而不是access的时候,千万要三思这个是不是lct,复杂度不对!!!。

希望下次碰到NOI day1t1那种题,别被误导,一切题不管多么像,一定先想性质。

当静态树的时候,除了极其特殊情况 重链剖分yyds!


下面这个题就丝毫不会误导人。。。。。。

确实挺有意思的。。。。。

bzoj2759

这个题首先看到树的形态这么多变,所以可以放心的lct......

这个题的话,我们考虑我们随意钦定一个环上的点为根,然后维护转移矩阵。

这样尽管我们无法维护时时所有点的值,我们也可以当作每一个点有一个点权,然后每次询问是查询链。。。

接下来考虑如何求解根节点,以及如何维护基环树,(有点繁呀)。

我大概就是照着别人的代码“抄袭”的。

首先基环树就是在钦定的根节点断环成链。然后只需要多维护一个转移到根节点的边即可。

具体解方程我们就查询这条到根节点的边的另一端的点的表达式,然后解方程即可。

换边时候,先切掉一条边,如果基环断裂,那就先加入基环,然后在加入一条边。

不细想会感觉这个很难的样子,实则不然,考虑由于是基环树,如果现在断了基环,那么相当于一棵树被割裂开了。(n个点,n-2条边)

而且是这棵新树的“有向根”没有了父亲,所以把这个新树和原来的根连接即可,原来的根不在是根,而新树的根会获得一条“基环边”。

如果没有段基环,就是把子树独立出去了,这是很simple的情况。

所以这个题还是挺有意思的把。。。。。。。。。。


link-cut-tree
https://proton-z.github.io/2021/12/24/link-cut-tree-simple-thoughts/
作者
Imitators
发布于
2021年12月24日
许可协议