1 条题解
-
0
题解
思路
对顶点 ,记执行 $ exttt{dfs}(u)T_u$。它按输入顺序连接若干块:
序列可能因为共享子图而指数增长,不能在完整数据中真正展开。对于任意序列,只需维护其中 的数量、 的数量和逆序对数。
若把序列 与 连接,则新增的跨区间逆序对数为
做法
子任务 1
图为有向树时,每条边只在 DFS 中经过一次,。可以按题意显式遍历:遇到 就增加已见的 数量,遇到 就把此前的 数量加入答案。
子任务 2
当 时,DAG 中的路径数至多为指数规模。直接按题意展开 DFS 调用树,并用同样的方法统计产生的二进制序列。
完整算法
先求图的拓扑序,再按逆拓扑序计算每个 的三元组 。
对一条权值为 、终点为 的边,它对应的块是 。块内逆序对数为
而块中的 、 数量分别在 基础上加入边权本身。按照出边输入顺序逐块连接,并用连接公式累计跨块逆序对。
正确性证明
对任意顶点 ,其 DFS 输出恰由各条出边对应的 按输入顺序连接而成。逆拓扑处理时,所有子顶点的三元组均已正确得到。
每个块内部的逆序对由子序列内部逆序对和“开头边权为 、后面子序列元素为 ”两部分组成。连接当前前缀与新块时,所有新增逆序对恰由前缀中的 和新块中的 配对,数量为二者数量之积。除此之外没有跨块逆序对。
因此,逐块合并后得到的三元组与真实 完全一致。由逆拓扑归纳,顶点 的逆序对数正确,即为所求答案。
复杂度
设边数为 。完整算法的时间复杂度为 ,空间复杂度为 。
- 1
信息
- ID
- 1173
- 时间
- 2000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者