1 条题解

  • 0
    @ 2025-8-24 22:22:47

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar yxzy4615
    **

    搬运于2025-08-24 22:22:47,当前版本为作者最后更新于2021-10-14 08:48:40,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    题目描述

    给定nn个点,mm条边的有向无环图。不保证图联通。 qq次询问,每次给出kkkk个互不相同的数cic_i ,求出如果去掉这kk个点,整个有向无环图将剩余多少条链。答案对109+710^9+7取模。每次询问独立。

    • “链”的定义是:我们设一条长度为pp的链的路径为w0w1wp1wpw_0\to w_1\to\cdots\to w_{p-1}\to w_p ,则应满足w0w_0入度为00wpw_p出度为00。你可以将其理解为一条食物链。

    • 两条链是“不同的”,当且仅当它们的长度不同,或者经过的点集不同。

    • 需要特别注意的是,删去某些点后新产生的链不计入答案。 例如12341\to 2\to 3\to 4一图中,有11条链12341\to 2\to 3\to 4。如果去掉22号点,则剩余00条链。

    数据范围

    • Subtask 1(1 point):给定的图是一条链。
    • Subtask 2(14 points):n,q10n,q\leq 10
    • Subtask 3(20 points):q103q\leq 10^3
    • Subtask 4(17 points):k=1k=1
    • Subtask 5(18 points):k=2k=2
    • Subtask 6(30 points):无特殊限制。

    对于100%100\%的数据:2n2×1032\leq n\leq 2\times 10^3,$1\leq m\leq \min(\frac{n\times(n-1)}{2},2\times 10^4)$,1q5×1051\leq q\leq 5\times 10^5

    所有询问满足:1k2×1061\leq \sum k\leq 2\times 10^60kmin(n,15)0\leq k\leq \min(n,15)1cin1\leq c_i\leq n。保证 cic_i互不相同。

    题目分析

    Subtask1Subtask1

    很明显,如果 k=0k=0 就只有一条链,否则就没有。

    Subtask23Subtask2-3

    标记删掉的点,暴力去跑图。

    fif_i表示以ii结尾的链数,转移显然:

    (u,v),fvfu+fv∀(u,v),f_v\leftarrow f_u+f_v

    时间复杂度O(qm)O(qm)

    Subtask4Subtask4

    k=1k=1的情况下,考虑删去的点会对答案产生多少贡献。

    拿样例作分析:

    入度为00的点是33,出度为00的点是55。手玩找出fif_i

    $ \begin{matrix} i & 1 & 2 & 3 & 4 & 5 & 6 & 7\\ f_i & 1 & 2 & 1 & 6 & 13 & 4 & 1 \end{matrix} $

    再找出每个点到出度为00的点的方案数n ⁣fin\!f_i

    $ \begin{matrix} i & 1 & 2 & 3 & 4 & 5 & 6 & 7\\ n\!f_i & 3 & 3 & 13 & 1 & 1 & 2 & 4 \end{matrix} $

    手玩答案后汇总得:

    $ \begin{matrix} i & 1 & 2 & 3 & 4 & 5 & 6 & 7\\ f_i & 1 & 2 & 1 & 6 & 13 & 4 & 1\\ n\!f_i & 3 & 3 & 13 & 1 & 1 & 2 & 4\\ ans_i & 10 & 7 & 0 & 7 & 0 & 5 & 9 \end{matrix} $

    ss为出度为00fif_i的和,发现ansi=sfi×n ⁣fians_i=s-f_i\times n\!f_i

    O(m)O(m)预处理,O(1)O(1)查询,总复杂度O(q+m)O(q+m)

    Subtask5Subtask5

    对于k=2k=2,直接用 ans=sfi×n ⁣fifj×n ⁣fjans=s-f_i\times n\!f_i-f_j\times n\!f_j计算可能会出问题,因为同时经过i,ji,j的链会被重复计算,考虑两点容斥。

    di,jd_{i,j}表示在原图上iji \to j的方案数,还是通过样例:

    $ \begin{matrix} d_{i,j} & 1 & 2 & 3 & 4 & 5 & 6 & 7 & i\\ 1 & 1 & 0 & 0 & 2 & 3 & 1 & 0 & \\ 2 & 0 & 1 & 0 & 1 & 3 & 1 & 0 & \\ 3 & 1 & 2 & 1 & 6 & 13 & 4 & 1 & \\ 4 & 0 & 0 & 0 & 1 & 1 & 0 & 0 & \\ 5 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & \\ 6 & 0 & 0 & 0 & 1 & 2 & 1 & 0 & \\ 7 & 0 & 1 & 0 & 2 & 4 & 1 & 1 & \\ j & \end{matrix} $

    可以发现一个性质:若 iji\ne j,则 di,j×dj,i=0d_{i,j}\times d_{j,i}=0显然成立。

    • 如果 di,j=dj,i=0d_{i,j}=d_{j,i}=0,代表 i,ji,j到出度为00的点的路径不相交,直接用 ans=sfi×n ⁣fifj×n ⁣fjans=s-f_i\times n\!f_i-f_j\times n\!f_j 计算即可。
    • 如果 di,j0d_{i,j}\ne 0,代表 i,ji,j到出度为00的点的路径中 ii包含 jj,重复路径就是 fi×di,j×n ⁣fjf_i\times d_{i,j}\times n\!f_j,用 $ans=s-f_i\times n\!f_i - (f_j - f_i \times d_{i,j})\times n\!f_j$ 计算即可。
    • 如果 dj,i0d_{j,i}\ne 0。用 $ans=s-f_i\times (n\!f_i - f_j \times d_{j,i})- f_j\times n\!f_j$ 计算即可,同上。

    所以,总计算式为:

    $$ans=s-(f_i-f_j\times d_{j,i})\times n\!f_i - (f_j - f_i \times d_{i,j})\times n\!f_j $$

    O(nm)O(nm)预处理,O(1)O(1)查询,总复杂度O(nm+q)O(nm+q)

    Subtask6Subtask6

    到此,思路已经全部出来了,将k=2k=2的情况扩展。对所有删去的点的每个点对 (i,j)(i,j),如果ii能到达jj,就往iji\to j连一条的边,然后再拓扑排序一遍:对于每个点ii的出边 ppfpfpfi×di,pf_p\leftarrow f_p-f_i\times d_{i,p} 。最后统计答案,即

    ans=si=1kfci×n ⁣fcians=s-\sum\limits_{i=1}^kf_{c_i}\times n\!f_{c_i}

    这个可以通过预处理拓扑序避免每次询问再跑一遍拓扑,即根据拓扑序排序后进行容斥。

    O(nm)O(nm)预处理,O(k2)O(k^2)查询,总复杂度O(nm+kk)O(nm+k\sum k)

    参考代码

    • 1

    信息

    ID
    5281
    时间
    2000ms
    内存
    256MiB
    难度
    5
    标签
    递交数
    0
    已通过
    0
    上传者