1 条题解
-
0
这么牛。
考虑 怎么做。删边离线下来做线段树分治即可。
我们观察线段树分治的本质结构。删边通过离线转化为了存活时间段,将存活时间段挂在线段树上,每个叶子的信息是根到叶子的路径信息并,通过从根开始 DFS 将问题变为插入和撤销。
时,一个显然想法是找到 和 对应叶子在线段树上的 LCA,其实就是猫树分治。对于这个 LCA,设其区间为 ,中点为 , 可以被拆为 。根据叶子到根信息的结构,LCA 与其任意祖先上的边都必定会被加入。在仅加入这些边的情况下,图构成了若干连通块。LCA 子树内的加边会涉及若干连通块合并。若某个连通块在子树加边后并没有发生合并,那么这个连通块完全可以被忽略,涉及其的询问不难计算答案。故我们只关心这些重要的连通块。线段树上所有重要的连通块个数是 的,因为每条边只会贡献到树上其所有祖先。
考虑询问 ,一个 符合条件当且仅当 时刻内, 和 均处于同一个连通块内。对连通块标号,那么 符合条件当且仅当 和 在 内所有标号对应相等。
注意到一个关键连通块的标号可以从儿子标号继承过来,所以这个做法看起来是有前途的。考虑深入刻画一下这个结构。
首先将 拆成 和 ,限制变为 与 。将前后缀相等转化为 LCP 和 LCS,根据后缀数组理论只需要考虑排序后相邻的 LCP 和 LCS,对于线段树上每个区间 将其所有连通块按照 与其反串分别按照字典序排序,然后求出相邻 LCP,对于 和 分别是两个可行区间,做一个二维数点即可解决原问题。
现在问题转化为对于线段树每个区间 ,将所有重要连通块 按照 排序,并支持求两个不同连通块的 的 LCP。反串和 LCS 同理。
显然 是通过左右儿子拼接所得,如果其在左右儿子中并非重要连通块,那么直接加入 个 。然后直接做双关键字排序即可。
LCP 是简单的,根据上述比大小的方式直接在线段树上走即可。
总复杂度是两个 。
- 1
信息
- ID
- 9661
- 时间
- 6000ms
- 内存
- 1024MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者