1 条题解

  • 0
    @ 2026-4-24 0:09:06

    这么牛。

    考虑 l=rl=r 怎么做。删边离线下来做线段树分治即可。

    我们观察线段树分治的本质结构。删边通过离线转化为了存活时间段,将存活时间段挂在线段树上,每个叶子的信息是根到叶子的路径信息并,通过从根开始 DFS 将问题变为插入和撤销。

    lrl \neq r 时,一个显然想法是找到 llrr 对应叶子在线段树上的 LCA,其实就是猫树分治。对于这个 LCA,设其区间为 [L,R][L,R],中点为 midmid[l,r][l,r] 可以被拆为 [l,mid](mid,r][l,mid] \cup (mid,r]。根据叶子到根信息的结构,LCA 与其任意祖先上的边都必定会被加入。在仅加入这些边的情况下,图构成了若干连通块。LCA 子树内的加边会涉及若干连通块合并。若某个连通块在子树加边后并没有发生合并,那么这个连通块完全可以被忽略,涉及其的询问不难计算答案。故我们只关心这些重要的连通块。线段树上所有重要的连通块个数是 O(Eilogn)O(\sum |E_i| \log n) 的,因为每条边只会贡献到树上其所有祖先。

    考虑询问 x,l,rx,l,r,一个 yy 符合条件当且仅当 [l,r][l,r] 时刻内,xxyy 均处于同一个连通块内。对连通块标号,那么 yy 符合条件当且仅当 xxyy[l,r][l,r] 内所有标号对应相等。

    注意到一个关键连通块的标号可以从儿子标号继承过来,所以这个做法看起来是有前途的。考虑深入刻画一下这个结构。

    首先将 [l,r][l,r] 拆成 [l,mid][l,mid](mid,r](mid,r],限制变为 sx[lmid]=sy[lmid]s_x[l \cdots mid] = s_y[l \cdots mid]sx(midr]=sy(midr]s_x(mid\cdots r] = s_y(mid\cdots r]。将前后缀相等转化为 LCP 和 LCS,根据后缀数组理论只需要考虑排序后相邻的 LCP 和 LCS,对于线段树上每个区间 [a,b][a,b] 将其所有连通块按照 sx[ab]s_x[a \cdots b] 与其反串分别按照字典序排序,然后求出相邻 LCP,对于 [l,mid][l,mid](mid,r](mid,r] 分别是两个可行区间,做一个二维数点即可解决原问题。

    现在问题转化为对于线段树每个区间 [a,b][a,b],将所有重要连通块 xx 按照 sx[ab]s_{x}[a \cdots b] 排序,并支持求两个不同连通块的 sx[ab]s_{x}[a \cdots b] 的 LCP。反串和 LCS 同理。

    显然 sx[ab]s_x[a\cdots b] 是通过左右儿子拼接所得,如果其在左右儿子中并非重要连通块,那么直接加入 lenlenx+nx+n。然后直接做双关键字排序即可。

    LCP 是简单的,根据上述比大小的方式直接在线段树上走即可。

    总复杂度是两个 log\log

    • 1

    信息

    ID
    9661
    时间
    6000ms
    内存
    1024MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者