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 圆方树而是用普通的广义圆方树题可以看一下点点的最大流 .

posted @ 2022-11-12 17:02  Jijidawang  阅读(108)  评论(12编辑  收藏  举报
😅​