1 条题解
-
0
DSU Master:题解
思路
固定前缀长度 。如果 ,边 有机会向当前包含顶点 的汇点连入一条边;如果 ,它不会产生这种贡献。
记
表示在只看前 条边的相对顺序时,顶点 在处理边 前仍是所在连通块汇点的有效排列数。加入边 后:若 ,原有 个插入位置都保持汇点,故乘 ;若 ,恰有一个插入位置会使顶点 不再是汇点,故乘 。这正是 。
令 为题目要求的长度为 的所有排列的值之和。把新边 插入旧排列:旧贡献在 个插入位置中各出现一次,得到 ;当且仅当 时,还新增 条指向顶点 的边。因此
两条递推都可在线性时间维护。
做法
满分做法按输入顺序维护 与 。读入 后,先用当前 更新并输出 ,再计算 。
子任务算法
- 子任务 1:枚举每个 的全部 个排列,按题意用并查集模拟有向合并。
- 子任务 2:先计算所有 ,再对每个 显式求和 ,复杂度 。
- 子任务 3:使用上述两个滚动递推,复杂度 。
正确性证明
引理 1: 等于处理边 前顶点 仍为所在连通块汇点的有效相对顺序数。
证明:。将边 插入已有顺序时共有 个位置。若 ,它指向左侧汇点,所有位置都保留顶点 为汇点;若 ,恰有一个位置使右侧汇点接管,只有 个位置有效。因此转移为 。归纳成立。
引理 2:。
证明:把新边 插入每个长度 的排列,共有 个位置,所以既有入边贡献被重复 次。新边仅在 且顶点 仍为汇点时贡献一条入边,这类排列由引理 1 恰有 个。故递推成立。
定理:算法输出每个 的正确答案。
证明:由引理 2,从 依次计算得到的 恰为全部 个排列的值之和;所有运算按模数进行,不改变模意义答案。
复杂度
每组测试时间复杂度 ,空间复杂度 ;所有测试合计为 。
- 1
信息
- ID
- 1368
- 时间
- 2000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者