2022.11.12 闲话
一个维护置换 Trick 好像普遍性非常强,参见 ARC149D .
可能等 STAOI 结束之后写一篇闲话详说一下这个 Trick 吧 .
观察到一种神奇的图 .
以下所有 \(n\) 是点数,\(m\) 是边数 .
它有一个性质是每个点至多属于一个简单环 . 暂且把它称为 laxCactus .
laxCactus 就是特殊的仙人掌,当然也能圆方树 . 另外 laxCactus 有一个好处就是缩点之后就会变成一棵树 .
比如定义一个 Patricia 圆方树为将一个 laxCactus 的所有环缩成方点,别的变成圆点的树,这可以 DFS 或者 Tarjan 做到线性 .
然后可以看看一些应用,比如 lxl 给小朋友讲课的时候曾经提到过一个东西:
来自 lxl 的馈赠
对于一个 laxCactus,若它的一个连通子图 \(G\) 满足去掉桥后只剩两个独立的环,则称其为一个眼镜(你画一下会发现真的很像眼镜的).
现在给一个 laxCactus,问它有多少个眼镜子图,对 \(10^9+7\) 取模 .
\(1\le n\le 3\times 10^6\) .
这个建出 Patricia 圆方树后实际上就是对于每个方点点对 \((u,v)\) 产生 \(2^{d(u,v)}\) 个眼镜,其中 \(d(u,v)\) 是 Patricia 圆方树上 \(u,v\) 间方点个数 .
这样树形 DP 一下即可,时间复杂度 \(\Theta(n)\) .
复杂度不用带 \(m\),是因为 laxCactus 的话必然有 \(m\le \dfrac32n\),\(\dfrac n2\) 个二元环构成链时取到等号 .
一个类似的题目:
你妈的能不能把第二个例题的题目名称改掉
给一个 laxCactus,问有多少个二元组 \((u,v)\) 使得 \(u\) 到 \(v\) 的简单路径条数等于 \(2\) .
特别的,我们认为 \(u\) 到 \(u\) 的简单路径条数为 \(1\) .
\(1\le n\le 3\times 10^6\) .
仍然是建出 Patricia 圆方树,这个问题比上一个相对就简单很多了,简单路径条数等于 \(2\) 产生只会有下面两种:
- 两个点在同一个环上 .
- 两个点都在环上,且 Patricia 圆方树上它们之间仅有一个圆点 .
每个方点上记录一下环长,然后随便计算一下贡献即可 \(\Theta(n)\) .
其实记环长的话就可以看做所有点都是一样的,没有圆方之分这种了 .
Cactus to Tree
给一个 laxCactus,要删一些边把它变成树,删边方法你自己定 .
对于每个节点,要最小化它与树中的叶子之间的最大距离,输出这个距离 . 每个询问独立 .
\(1\le n\le 5\times 10^5\) .
这个是 CF980F .
仍然是先建 Patricia 圆方树,考虑在这个树上进行换根 DP,也就是对每个点分别求出向上和向下的最长链 .
对于环上的一个点 \(u\),断掉的肯定是这个点正对的边,这样就可以沿着近路走到每个点,则答案就是 \(\displaystyle\max_v\{d_v+\operatorname{dist}(u,v)\}\),\(d_u\) 是 \(u\) 到环外的最长链 .
dist 有大概的单调性,于是可以两遍单调队列求出答案,总时间复杂度 \(\Theta(n)\) .
注:不用 Patricia 圆方树而是用普通的广义圆方树题可以看一下点点的最大流 .
以下是博客签名,正文无关
本文来自博客园,作者:Jijidawang,转载请注明原文链接:https://www.cnblogs.com/CDOI-24374/p/16883407.html
版权声明:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0)进行许可。看完如果觉得有用请点个赞吧 QwQ