1 条题解
-
0
问题理解
我们有 个点,每个点有一条出边 。
这构成一个基环内向树森林(每个连通分量是一个环,环上每个点可能挂着一棵树,树边指向环)。初始从 出发,走 步( 极大,),到达点 。这是原图的 步终点。
允许修改一条边:选择 ,把 的出边改成 。
修改后,重新从 出发走 步,要求到达 。
我们要对每个 计数这样的 对数。
初步分析
在固定图中从 出发走 步,由于每个点出度为 ,路径唯一,且最终会进入一个环并循环。
设原图中从 出发走无穷步,会进入一个环 ,环长 ,进入环前的链长度为 ( 是进入环前经过的节点数,从 到环的第一个点的步数)。那么 步后所在的位置可分类讨论:
- 如果 ,则还在入环链上。
- 否则,到达环上的位置为从环入口开始走 步所在的环上节点(环上编号从入口为 0 开始)。
对于原问题,我们首先要找出 (原图 步终点)。
修改的影响
情况分类
修改 可能:
- 不影响 步路径:无论如何改, 步依然到达原来的 。这包括很多对 。
- 改变路径,使得 步到达不同的点 。
我们要对每个 计数 。
关键观察
因为 ,所以在原图中, 步后一定在某个环上(因为链长度至多 )。
记原图从 出发的无穷路径是: $ 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 $ 其中 是环入口, 是环上第 个点()。
原终点计算
设 ,那么 $ \text{原终点 } p_0 = c_{r},\quad r = (K - d_{\text{enter}}) \bmod L。 $
修改后的影响分类
1. 修改不涉及路径上的点
如果 不在原路径 的 步节点序列中,并且 不在 的“前驱树”中(这里的前驱指原图的反向边能到 且在 步路径中),那么改 的出边不影响路径,终点还是 。这对计数到 有帮助。
2. 修改涉及路径上的点
这是关键部分。
把原路径 步节点列出来: 其实我们不需要显式计算 ,因为 很大,会进入循环部分。更有效的方法:考虑修改 的出边到 。
子情况 2.1: 在环外树部分(不在环上)
如果 在环 外,那么原路径可能会因为改边而提前进入其他环或原环的不同入口,需要仔细分析,但有一个系统的方法:
用倍增法或周期分析法:
- 原路径上每个节点 的 步后会到 。
- 如果我们在 处改到 ,那么从 1 到 的原路径不变,到 后走一步到 ,然后从 走 步到达最终点。
所以关键是计算从 出发走 步会到哪。
可能很大,我们需要知道 所在的连通分量的环长等信息。
3. 环上修改特别分析
若 在环 上,那么原路径可能在绕环若干次后到达 。改 到 会打破环,可能:
- 使路径走到另一个环。
- 或进入同一个环的不同位置,最终 步终点改变。
统一框架
定义:
- :原图中从 到 的步数(如果不可达则为 )。
- : 所在环的长度(如果 在树上,则指从 出发走无穷步进入的环的长度)。
- :从 出发走无穷步首次进入环时的环上节点(环上编号)。
但我们不能直接显式计算 步后的位置,必须用模运算。
更简洁的方法(官方解法思路):
步骤 1:找出所有环
原图每个连通分量是一个基环树。找出所有环长 和环上节点。
步骤 2:原终点
计算 。
步骤 3:分类计数
令 非常大,所以对于大多数 , 仍然很大(),所以从 出发的剩余步数足够进入环并绕圈。
因此最终位置仅取决于:
- 所在的环 的环长 ,
- 从 出发走 步后,在环 上的偏移量 。
其中 是 到它所在环的入口距离。
数学简化
设我们选择 ,设 。
若 ,那么 不在 步路径上,改 不影响前 步(因为走不到 ),所以终点还是 。但 ,而 最大 ,所以不可能 (因为 )。
所以任何 都可能在 步路径上?不一定,如果 不在 1 能到达的点中,则 ,那么改 不影响 1 的路径,所以终点还是 。
实际上,更系统的计数方式是:
对于给定的目标终点 ,考虑哪些 能使终点为 。
逆推思路
终点为 的条件:
存在某个 ,使得 1 走 步到 。想象从 倒推 步找起点 1 在反图的位置。
反图上, 的前驱是那些指向 的点。但图不是树,所以可能多个前驱。
设 表示从 出发走 步到达的点(原图方向)。
我们要 ,其中 表示修改 后的图。对于 不在 1 到 路径上的情况,,所以若要等于 ,则必须 在原路径上。
所以只需考虑 在原路径 的某个前缀位置。
路径表示
设原路径序列: $ P_0=1, P_1, P_2, \dots, P_{d_{\text{enter}}}, \dots $ 进入环后 。
记 。
设 ,(但 可能很大,不过环上会循环,所以 可能是环上某个点)。当 时,原路径在 之后走 步到 。
现在改 ,则从 走一步到 ,再从 走 步到某点,该点必须等于 。
所以问题转化为:
对每个 ,对每个 且 有意义(因为 很大, 在环上循环),找 使得
周期处理
因为 很大, 也大。设 。
对固定的 ,从 出发走 步会进入一个环 ,环长 。设从 走 步进入环,环入口节点 (环上位置 0)。
则走 步时,若 ,则最终在环上位置 。所以要求: $ \text{环入口 } e_b \text{ 再走 } (T-d_b) \bmod L_b \text{ 步到达 } i。 $ 即 必须与 在同一个环 上,且环上从 到 的距离(有向)等于 。
最终算法(无代码描述)
- 预处理原图:找出所有环、环长、每个点走若干步到的环上位置。
- 原终点 :直接模拟或倍增找 步位置。
- 枚举可能的 :由于 ,实际上 可以是任何点,但只有某些 使得 且 在路径上才会改变终点。 进一步,若 不在 1 可达点,则改它无影响,终点还是 。
- 对每个 计算 :
- 若 ,不可能(因为 大,不会发生)。
- 否则,枚举 使得从 走 步到达 。由于 极大,最终位置只由 所在环决定。
- 对环分类:每个环 长 ,环上节点 。
从环上某点 走 步到达 。 所以从 走 步到达 的条件化为:- 在环 上,设环上位置 。
- 从 出发走 步到环入口 ,设环上位置 。
- 要求 。 即 。
于是 满足: 走 步到环上位置 (该式由 定出)。
所以可以预先计算每个环上位置有哪些 (通过反向边传播)。
这样我们就能对每个 计数 :
- 固定 得 。
- 由 确定目标环上位置 。
- 该位置对应的 集合已知,大小加进答案。
注意 可以等于 ,也允许改到原来的目的地。
最后一步: 不在 1 可达点
此时终点总是 ,所以这些 全贡献给 的答案。
总结
本题核心是:
- 基环树的结构分析。
- 利用 大的性质,将步数取模转化为环上位置问题。
- 通过反向预处理,对每个 快速计算符合条件的 的数量,并结合 的条件计数。
尽管 极大,但 较小,我们利用环长不超过 ,将大 步数取模处理,从而在 或 复杂度完成计数。
- 1
信息
- ID
- 5986
- 时间
- 2000ms
- 内存
- 512MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者