1 条题解

  • 0
    @ 2025-8-24 23:11:49

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar nullqtr_pwp
    我注意到有些人一直在做各种地方的cnoi题,但是并没有什么b用,可能是因为一直在舒适区里面舒服的卷,虐杀自己擅长的东西并获得成就感。

    搬运于2025-08-24 23:11:49,当前版本为作者最后更新于2025-07-26 12:59:35,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    先考虑断开割边的情况,答案是 nn。注意特判断开后一侧大小恰好为 11 的情况,此时答案为 n1n-1。接下来我们认为,断开的边都不是割边。考虑对于每个点双分开做,可以建立圆方树后求出所有点双,并预处理原图的割点个数,作为这个点双之外的贡献。那么在原图的割点在这个点双里面就不会有额外的贡献。令 cutu{0,1}cut_u\in\{0,1\} 表示 uu 是否为原图 GG 的割点。

    套路化地求出当前点双连通分量 GG'DFS\text{DFS} 生成树 TT,由经典结论只有树边和返祖边。

    【删除返祖边】

    对于删除返祖边 (u,v)(u,v) 的答案,找到所有在 uvu\to v 路径上,并且不是这条路径最上面一条的树边集合 P(u,v)P(u,v)。对于每条树边 ee,记录其在多少个返祖边的 P(u,v)P(u,v) 中,记为 numenum_e。对于 covcov,可以树上差分求。如果 nume=1num_e=1,令这条边是 (u,fau)(u,fa_u),那么删除覆盖 ee 的那条边后,ee 就没有非树边,uufafaufa_{fa_u} 就不连通,faufa_u 成为割点。因此统计贡献就再求一遍 P(u,v)P(u,v) 上有多少 cove=1cov_e=1cutfau=0cut_{fa_u}=0,这里树上前缀和即可。

    【删除树边】

    重点在于删除树边 (u,fau)(u,fa_u) 的情形。边双连通分量的好处是删除树边后仍然连通,并且我们只关心所有跨过 (u,fau)(u,fa_u) 祖先链的点,否则别的点必然上下连通,而“上部分”就与删除树边那一块连通。因此新的割点 xx 只能是 uu 子树内的点或者 uu 的祖先。

    • xxuu 子树的点。

    此时 xux\ne u,否则点 uu 自身就会把 GG' 分裂成进一步的点双。此时 GG' 分为根减去 uu 子树,uu 子树减去 xx 子树,以及 xx 的一堆子树。将其称为上,中,下。如果上和中有返祖边连接,此时 (u,fau)(u,fa_u) 是否删去无所谓,xx 不可能成为割点;接下来上,中是不连通的。此时 xx 成为割点当且仅当不存在 xx 某个儿子 sis_i 的子树同时与上,中部分连通。

    此时考虑下端点在 sis_i 子树,上端点在 xx 祖先的返祖边的上端点的深度,其对应区间 [l,r][l,r],就要求 depuldep_u\leq l 或者 depu>rdep_u>r。对于一个 xx,考虑其所有 sis_i,就可以得到 O(degx)\mathcal O(\deg_x) 个限制区间使得 uu 的深度不能在限制区间中。关于上,中部分没有边的限制,求出所有下端点 viv_iuu 子树,但是上端点为 uu 祖先的 viv_ilca=d\text{lca}=d(由于 GG' 点双连通,所以 dd 存在)。其中 dd 的维护可以使用树上并查集从下往上维护,也可以描述成深度区间的限制。然后使用线段树,维护 dfs 序,并且支持区间加区间最小值个数即可维护。

    • xxuu 的祖先。

    特判掉 xx 为树根的 corner case。此时 GG' 分为根减去 xx 子树,xx 子树减去 uu 子树以及 uu 子树,还是分为上中下三部分。我们要求下面不同时与中和上连通。分为下端点在 uu 子树的返祖边的上端点均在 xx 或比 xx 更深的位置;以及均在 xx 或者比 xx 更浅的位置。

    时间复杂度 O(nlogn)\mathcal O(n\log n)

    • 1

    信息

    ID
    11833
    时间
    2500ms
    内存
    1024MiB
    难度
    7
    标签
    递交数
    0
    已通过
    0
    上传者