1 条题解
-
0
题意回顾
- 个样品瓶,编号 到
- 到 号瓶有不同物质, 到 号瓶为空
- 条有向边表示导管,形成 DAG(有向无环图)
- 任何时候只能打开一个导管夹
- 物质会留下沉淀,不能混合不同物质
- 对每个区间 (),定义 为能安全转移到该区间内样品瓶的最大物质种类数
- 求对每个 ,满足 的区间个数
数据范围:,,
关键观察
1. 物质传输的限制
由于任何时候只能打开一个导管夹,且物质会留下沉淀,这意味着:
- 每种物质必须沿着一条独立的路径传输到目标瓶
- 不同物质的传输路径不能有公共节点(除了起点)
- 因为经过公共节点会留下沉淀,污染其他物质
2. 问题转化
对于区间 , 等于能选择的不相交路径的最大数量,使得:
- 每条路径从某个源点 出发
- 每条路径的终点都在 中
- 所有路径点不交(除了起点)
3. 利用 小的特性
由于 ,可以考虑对每个源点集合计算信息。
算法核心
1. 预处理每个物质的可达集合
对每个源点 ,计算它能到达的所有节点集合 。
由于是 DAG,可以用 BFS 或 DFS 在 时间内计算。
2. 定义关键数组
设 表示能容纳源点集合 中所有物质的最小右端点:
- 即存在一种方式,将 中所有物质传输到区间 中
- 且 最小
计算方法:对每个源点 ,选择它可达节点中编号最小的作为目标,但要确保所有路径点不交。
实际上, 可以这样计算:
- 对 中所有源点,找到一组不相交的路径到达某些目标节点
- 取这些目标节点编号的最大值作为
3. 计算
对于区间 , 是最大的 满足 且所有路径的起点都在 中。
更精确地说:
高效计算
贪心匹配
对集合 ,我们想找到一组不相交路径,使得最大目标编号最小。
算法:
- 将 中源点按某种顺序排序
- 对每个源点,选择它可达的编号最小的节点作为目标
- 如果该节点已被占用,选择下一个最小的,依此类推
- 等于所有选择目标中的最大编号
实现细节
由于 ,可以枚举所有 个子集 ,对每个 用贪心计算 。
统计区间个数
定义数组
设 表示 的区间个数。
计算方法
对于每个集合 ,设 ,则:
- 对所有 ,区间 至少能容纳 种物质
- 更精确地说:对固定的 ,满足 的 的范围可以确定
实际上,我们可以:
- 对每个 ,计算最大的 满足
- 这就是 的值
- 然后统计每个值出现的次数
最终
- 预处理所有 个子集 的
- 对每个 从 到 :
- 找到最大的 使得存在大小为 的集合 满足
- 这就是 对所有 的最大值
- 但需要更精细的计算:对每个 ,计算
- 统计 数组
复杂度分析
- 枚举所有子集:?需要优化
- 实际可以 完成
- 太大,但 时 不可行
优化算法
关键观察
由于 很小,可以用 DP 计算: 设 表示容纳集合 所需的最小右端点。
转移: $dp[mask] = \min\limits_{i \in mask} \max(dp[mask \setminus \{i\}], \text{minAvailableTarget}(i, mask))$
其中 表示在已占用 的目标后,源点 能选择的最小编号目标。
预处理
对每个源点 ,预处理它可达的所有节点,排序。
算法步骤
- 初始化 (空集合不需要任何目标)
- 从小到大枚举 ,计算
- 对每个 ,记录 对应的 值
- 最后统计区间个数
统计答案
对每个 ,设
则对区间 ,(因为我们可以总是选择最优的 )
所以 = 满足 的 的个数 × 对应的 的个数。
实际上,对每个 ,所有 都有相同的 值,所以:
总结
本题的核心解法:
- 利用 小的特点,枚举所有源点子集
- 用 DP 计算容纳每个子集所需的最小右端点
- 根据 DP 结果统计满足 的区间个数
- 时间复杂度 ,可处理大规模数据
通过状态压缩 DP 和组合计数,高效解决了这个复杂的物质传输计数问题。
- 1
信息
- ID
- 4554
- 时间
- 3000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 4
- 已通过
- 1
- 上传者