1 条题解
-
0
问题分析
我们有:
- 个开区间
- 正整数 表示直线上任意点最多被 个区间覆盖
- 每个区间的权重是它的长度
- 目标:选择一些区间,使得任意点覆盖数 ,且区间总长度最大
网络流建模思路
关键观察
将直线上的所有区间端点离散化,得到一系列坐标点。相邻点之间形成线段。
建图方法
-
节点:离散化后的所有坐标点(从小到大排序去重)
-
边:
- 相邻坐标点之间连边:容量 = ,费用 = → 表示在这段小区间上最多有 个区间覆盖
- 对于每个区间 ,在离散化坐标中找到对应位置,从 节点向 节点连边:
- 容量 = ,费用 = (用负费用求最大权) → 表示选择这个区间,花费为负的区间长度(最小费用流会优先选择)
-
源点 连第一个坐标点,容量 = ,费用 =
-
最后一个坐标点连汇点 ,容量 = ,费用 =
算法正确性解释
- 相邻坐标点间的容量 保证了任意小区间最多被 个选择的区间覆盖
- 每个区间边容量 保证每个区间最多选一次
- 最小费用流会优先选择费用更小(即原长度更大)的区间
- 最终费用取负就是最大总长度
样例验证
输入:
4 2 1 7 6 8 7 10 9 13区间长度:
- :长度6
- :长度2
- :长度3
- :长度4
离散化坐标:
建图:
- 相邻坐标点间:容量2,费用0
- 区间边:
- 1→7:容量1,费用-6
- 6→8:容量1,费用-2
- 7→10:容量1,费用-3
- 9→13:容量1,费用-4
- S→1:容量2,费用0
- 13→T:容量2,费用0
最小费用流结果:费用 = -15
最大总长度 = 15输出:
15验证:选择区间 (6) 和 (4) 和 (3)?不对, 和 在点7重叠?开区间 不包括7, 从7开始,在7点不重叠。
实际上最优解是:(6) + (3) + (4) = 13?
检查: 与 在 重叠,此时k=2允许。
但样例输出15,应该是 (6) + (2) + (4) + (3) = 15,在 段有 和 两个区间重叠,符合k=2。
算法步骤
- 读入 和所有区间,确保
- 离散化所有端点坐标
- 建图:
- 节点:离散化坐标点
- 相邻点间边:容量 ,费用
- 每个区间边:容量 ,费用
- →第一个点:容量 ,费用
- 最后一个点→:容量 ,费用
- 跑 到 的最小费用最大流
- 输出:
复杂度分析
- 坐标点数:最多
- 边数:
- 使用费用流算法在 时完全可行
关键点
- 离散化将无限直线变为有限点集
- 相邻点间容量k保证任意点覆盖数不超过k
- 负费用将最大化问题转化为最小费用流
- 开区间 在 处不覆盖,所以连边是 →
总结
这道题通过离散化和容量限制将区间选择问题转化为网络流模型,利用最小费用流求解最大权k-可重区间集,是区间调度问题的经典网络流解法。
- 1
信息
- ID
- 3990
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者