1 条题解

  • 0
    @ 2025-12-10 15:12:44

    问题理解

    我们有 NN 个点,每个点有一条出边 iAii \to A_i
    这构成一个基环内向树森林(每个连通分量是一个环,环上每个点可能挂着一棵树,树边指向环)。

    初始从 11 出发,走 KK 步(KK 极大,N105,K1018N \le 10^5, K \le 10^{18}),到达点 p0p_0。这是原图的 KK 步终点。

    允许修改一条边:选择 a,ba,b,把 aa 的出边改成 bb
    修改后,重新从 11 出发走 KK 步,要求到达 ii
    我们要对每个 ii 计数这样的 (a,b)(a,b) 对数。


    初步分析

    在固定图中从 11 出发走 KK 步,由于每个点出度为 11,路径唯一,且最终会进入一个环并循环。

    设原图中从 11 出发走无穷步,会进入一个环 CC,环长 LL,进入环前的链长度为 denterd_{\text{enter}}denterd_{\text{enter}} 是进入环前经过的节点数,从 11 到环的第一个点的步数)。那么 KK 步后所在的位置可分类讨论:

    1. 如果 K<denterK < d_{\text{enter}},则还在入环链上。
    2. 否则,到达环上的位置为从环入口开始走 r=(Kdenter)modLr = (K - d_{\text{enter}}) \bmod L 步所在的环上节点(环上编号从入口为 0 开始)。

    对于原问题,我们首先要找出 p0p_0(原图 KK 步终点)。


    修改的影响

    情况分类

    修改 (a,b)(a,b) 可能:

    • 不影响 KK 步路径:无论如何改,KK 步依然到达原来的 p0p_0。这包括很多对 (a,b)(a,b)
    • 改变路径,使得 KK 步到达不同的点 ii

    我们要对每个 ii 计数 (a,b)(a,b)


    关键观察

    因为 KNK \ge N,所以在原图中,KK 步后一定在某个环上(因为链长度至多 N1N-1)。

    记原图从 11 出发的无穷路径是: $ 1 \to x_1 \to x_2 \to \dots \to x_{d_{\text{enter}}} \to c_0 \to c_1 \to \dots \to c_{L-1} \to c_0\dots $ 其中 c0c_0 是环入口,cic_i 是环上第 ii 个点(cL=c0c_L = c_0)。


    原终点计算

    KdenterK \ge d_{\text{enter}},那么 $ \text{原终点 } p_0 = c_{r},\quad r = (K - d_{\text{enter}}) \bmod L。 $


    修改后的影响分类

    1. 修改不涉及路径上的点

    如果 aa 不在原路径 1p01 \to p_0KK 步节点序列中,并且 aa 不在 p0p_0 的“前驱树”中(这里的前驱指原图的反向边能到 aa 且在 KK 步路径中),那么改 aa 的出边不影响路径,终点还是 p0p_0。这对计数到 p0p_0 有帮助。


    2. 修改涉及路径上的点

    这是关键部分。
    把原路径 KK 步节点列出来: v0=1,v1,v2,,vK v_0=1, v_1, v_2, \dots, v_K 其实我们不需要显式计算 vKv_K,因为 KK 很大,会进入循环部分。

    更有效的方法:考虑修改 aa 的出边到 bb

    子情况 2.1:aa 在环外树部分(不在环上)

    如果 aa 在环 CC 外,那么原路径可能会因为改边而提前进入其他环或原环的不同入口,需要仔细分析,但有一个系统的方法:

    用倍增法或周期分析法:

    • 原路径上每个节点 vtv_tKtK-t 步后会到 p0p_0
    • 如果我们在 aa 处改到 bb,那么从 1 到 aa 的原路径不变,到 aa 后走一步到 bb,然后从 bbKdist(1,a)1K-\text{dist}(1,a)-1 步到达最终点。

    所以关键是计算从 bb 出发走 M=Kdist(1,a)1M = K - \text{dist}(1,a) - 1 步会到哪。
    MM 可能很大,我们需要知道 bb 所在的连通分量的环长等信息。


    3. 环上修改特别分析

    aa 在环 CC 上,那么原路径可能在绕环若干次后到达 p0p_0。改 aabb 会打破环,可能:

    • 使路径走到另一个环。
    • 或进入同一个环的不同位置,最终 KK 步终点改变。

    统一框架

    定义:

    • distFrom1(u)\text{distFrom1}(u):原图中从 11uu 的步数(如果不可达则为 \infty)。
    • cycleLen(u)\text{cycleLen}(u)uu 所在环的长度(如果 uu 在树上,则指从 uu 出发走无穷步进入的环的长度)。
    • enterCyclePos(u)\text{enterCyclePos}(u):从 uu 出发走无穷步首次进入环时的环上节点(环上编号)。

    但我们不能直接显式计算 KK 步后的位置,必须用模运算。


    更简洁的方法(官方解法思路):

    步骤 1:找出所有环

    原图每个连通分量是一个基环树。找出所有环长 LcL_c 和环上节点。

    步骤 2:原终点 p0p_0

    计算 p0p_0

    步骤 3:分类计数

    t=Kt = K 非常大,所以对于大多数 aaKdist(1,a)1K - \text{dist}(1,a) - 1 仍然很大(N\ge N),所以从 bb 出发的剩余步数足够进入环并绕圈。

    因此最终位置仅取决于:

    1. bb 所在的环 CC' 的环长 LL'
    2. bb 出发走 MM 步后,在环 CC' 上的偏移量 (MdistToCycle(b))modL (M - \text{distToCycle}(b)) \bmod L'

    其中 distToCycle(b)\text{distToCycle}(b)bb 到它所在环的入口距离。


    数学简化

    设我们选择 aa,设 D=dist(1,a)D = \text{dist}(1,a)
    D>KD > K,那么 aa 不在 KK 步路径上,改 aa 不影响前 KK 步(因为走不到 aa),所以终点还是 p0p_0。但 KNK \ge N,而 DD 最大 N1N-1,所以不可能 D>KD > K(因为 KNK \ge N)。
    所以任何 aa 都可能在 KK 步路径上?不一定,如果 aa 不在 1 能到达的点中,则 D=D=\infty,那么改 aa 不影响 1 的路径,所以终点还是 p0p_0


    实际上,更系统的计数方式是:

    对于给定的目标终点 ii,考虑哪些 (a,b)(a,b) 能使终点为 ii


    逆推思路

    终点为 ii 的条件:
    存在某个 a,ba,b,使得 1 走 KK 步到 ii

    想象从 ii 倒推 KK 步找起点 1 在反图的位置。
    反图上,ii 的前驱是那些指向 ii 的点。但图不是树,所以可能多个前驱。


    f(u,m)f(u,m) 表示从 uu 出发走 mm 步到达的点(原图方向)。
    我们要 f(a,b;1,K)=if'(a,b; 1, K) = i,其中 ff' 表示修改 aba \to b 后的图。

    对于 aa 不在 1 到 p0p_0 路径上的情况,f(1,K)=p0f'(1,K)=p_0,所以若要等于 ip0i \neq p_0,则必须 aa 在原路径上。

    所以只需考虑 aa 在原路径 1p01\to p_0 的某个前缀位置。


    路径表示

    设原路径序列: $ P_0=1, P_1, P_2, \dots, P_{d_{\text{enter}}}, \dots $ 进入环后 Pdenter+t=ctmodLP_{d_{\text{enter}}+t} = c_{t \bmod L}

    PK=p0P_{K} = p_0
    a=Psa = P_s0sK0 \le s \le K(但 ss 可能很大,不过环上会循环,所以 aa 可能是环上某个点)。

    a=Psa=P_s 时,原路径在 aa 之后走 KsK-s 步到 p0p_0

    现在改 aba\to b,则从 aa 走一步到 bb,再从 bbKs1K-s-1 步到某点,该点必须等于 ii

    所以问题转化为:

    对每个 ii,对每个 s=0..Ks=0..KPsP_s 有意义(因为 KK 很大,PsP_s 在环上循环),找 bb 使得 从 b 出发走 Ks1 步到达 i \text{从 } b \text{ 出发走 } K-s-1 \text{ 步到达 } i。


    周期处理

    因为 KK 很大,ss 也大。设 T=Ks1T = K-s-1
    对固定的 bb,从 bb 出发走 TT 步会进入一个环 CbC_b,环长 LbL_b

    设从 bbdbd_b 步进入环,环入口节点 ebe_b(环上位置 0)。
    则走 TT 步时,若 TdbT \ge d_b,则最终在环上位置 (Tdb)modLb(T-d_b) \bmod L_b

    所以要求: $ \text{环入口 } e_b \text{ 再走 } (T-d_b) \bmod L_b \text{ 步到达 } i。 $ 即 ii 必须与 ebe_b 在同一个环 CbC_b 上,且环上从 ebe_bii 的距离(有向)等于 (Tdb)modLb(T-d_b) \bmod L_b


    最终算法(无代码描述)

    1. 预处理原图:找出所有环、环长、每个点走若干步到的环上位置。
    2. 原终点 p0p_0:直接模拟或倍增找 KK 步位置。
    3. 枚举可能的 aa:由于 KNK \ge N,实际上 aa 可以是任何点,但只有某些 aa 使得 s=dist(1,a)Ks = \text{dist}(1,a) \le Kaa 在路径上才会改变终点。 进一步,若 aa 不在 1 可达点,则改它无影响,终点还是 p0p_0
    4. 对每个 aa 计算 T=Kdist(1,a)1T = K - \text{dist}(1,a) - 1
      • T<0T < 0,不可能(因为 KK 大,不会发生)。
      • 否则,枚举 bb 使得从 bbTT 步到达 ii。由于 TT 极大,最终位置只由 bb 所在环决定。
    5. 对环分类:每个环 CCLL,环上节点 q0,,qL1q_0,\dots,q_{L-1}
      从环上某点 qjq_jtt 步到达 q(j+t)modLq_{(j+t)\bmod L}。 所以从 bbTT 步到达 ii 的条件化为:
      • ii 在环 CC 上,设环上位置 posipos_i
      • bb 出发走 dbd_b 步到环入口 ebe_b,设环上位置 posebpos_{e_b}
      • 要求 posi=(poseb+(Tdb))modLpos_i = (pos_{e_b} + (T-d_b)) \bmod L。 即 poseb=(posi(Tdb))modLpos_{e_b} = (pos_i - (T-d_b)) \bmod L

    于是 bb 满足:bbdbd_b 步到环上位置 posebpos_{e_b}(该式由 i,Ti,T 定出)。

    所以可以预先计算每个环上位置有哪些 bb(通过反向边传播)。


    这样我们就能对每个 ii 计数 (a,b)(a,b)

    • 固定 aaTT
    • i,Ti,T 确定目标环上位置 posebpos_{e_b}
    • 该位置对应的 bb 集合已知,大小加进答案。

    注意 aa 可以等于 bb,也允许改到原来的目的地。


    最后一步:aa 不在 1 可达点

    此时终点总是 p0p_0,所以这些 (a,b)(a,b) 全贡献给 i=p0i=p_0 的答案。


    总结

    本题核心是:

    1. 基环树的结构分析。
    2. 利用 KK 大的性质,将步数取模转化为环上位置问题。
    3. 通过反向预处理,对每个 ii 快速计算符合条件的 bb 的数量,并结合 aa 的条件计数。

    尽管 KK 极大,但 NN 较小,我们利用环长不超过 NN,将大 KK 步数取模处理,从而在 O(N)O(N)O(NlogN)O(N \log N) 复杂度完成计数。

    • 1

    信息

    ID
    5986
    时间
    2000ms
    内存
    512MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者