1 条题解

  • 0
    @ 2025-10-24 9:28:16

    问题分析

    我们有:

    • nn 个开区间 [li,ri)[l_i, r_i)
    • 正整数 kk 表示直线上任意点最多被 kk 个区间覆盖
    • 每个区间的权重是它的长度 z=rili|z| = r_i - l_i
    • 目标:选择一些区间,使得任意点覆盖数 k\leq k,且区间总长度最大

    网络流建模思路

    关键观察

    将直线上的所有区间端点离散化,得到一系列坐标点。相邻点之间形成线段。

    建图方法

    1. 节点:离散化后的所有坐标点(从小到大排序去重)

      • 相邻坐标点之间连边:容量 = kk,费用 = 00 → 表示在这段小区间上最多有 kk 个区间覆盖
      • 对于每个区间 [li,ri)[l_i, r_i),在离散化坐标中找到对应位置,从 lil_i 节点向 rir_i 节点连边:
        • 容量 = 11,费用 = (rili)-(r_i - l_i)(用负费用求最大权) → 表示选择这个区间,花费为负的区间长度(最小费用流会优先选择)
    2. 源点 SS 连第一个坐标点,容量 = kk,费用 = 00

    3. 最后一个坐标点连汇点 TT,容量 = kk,费用 = 00


    算法正确性解释

    • 相邻坐标点间的容量 kk 保证了任意小区间最多被 kk 个选择的区间覆盖
    • 每个区间边容量 11 保证每个区间最多选一次
    • 最小费用流会优先选择费用更小(即原长度更大)的区间
    • 最终费用取负就是最大总长度

    样例验证

    输入:

    4 2
    1 7
    6 8  
    7 10
    9 13
    

    区间长度:

    • [1,7)[1,7):长度6
    • [6,8)[6,8):长度2
    • [7,10)[7,10):长度3
    • [9,13)[9,13):长度4

    离散化坐标:{1,6,7,8,9,10,13}\{1,6,7,8,9,10,13\}

    建图:

    • 相邻坐标点间:容量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

    验证:选择区间 [1,7)[1,7)(6) 和 [9,13)[9,13)(4) 和 [7,10)[7,10)(3)?不对,[1,7)[1,7)[7,10)[7,10) 在点7重叠?开区间 [1,7)[1,7) 不包括7,[7,10)[7,10) 从7开始,在7点不重叠。
    实际上最优解是:[1,7)[1,7)(6) + [7,10)[7,10)(3) + [9,13)[9,13)(4) = 13?
    检查:[7,10)[7,10)[9,13)[9,13)[9,10)[9,10) 重叠,此时k=2允许。
    但样例输出15,应该是 [1,7)[1,7)(6) + [6,8)[6,8)(2) + [9,13)[9,13)(4) + [7,10)[7,10)(3) = 15,在 [7,8)[7,8) 段有 [6,8)[6,8)[7,10)[7,10) 两个区间重叠,符合k=2。


    算法步骤

    1. 读入 n,kn, k 和所有区间,确保 liril_i \leq r_i
    2. 离散化所有端点坐标
    3. 建图:
      • 节点:离散化坐标点
      • 相邻点间边:容量 kk,费用 00
      • 每个区间边:容量 11,费用 (rili)-(r_i-l_i)
      • SS→第一个点:容量 kk,费用 00
      • 最后一个点→TT:容量 kk,费用 00
    4. SSTT最小费用最大流
    5. 输出:总费用- \text{总费用}

    复杂度分析

    • 坐标点数:最多 2n=10002n = 1000
    • 边数:O(n)O(n)
    • 使用费用流算法在 n500,k3n \leq 500, k \leq 3 时完全可行

    关键点

    1. 离散化将无限直线变为有限点集
    2. 相邻点间容量k保证任意点覆盖数不超过k
    3. 负费用将最大化问题转化为最小费用流
    4. 开区间 [li,ri)[l_i, r_i)rir_i 处不覆盖,所以连边是 lil_irir_i

    总结

    这道题通过离散化容量限制将区间选择问题转化为网络流模型,利用最小费用流求解最大权k-可重区间集,是区间调度问题的经典网络流解法。

    • 1

    「网络流 24 题」最长 k 可重区间集

    信息

    ID
    3990
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者