1 条题解

  • 0
    @ 2026-8-19 9:12:36

    飞题解

    思路

    把每个风口看作一个可分配的时间点,把每只猪看作一个可接受时间点的闭区间。问题是求时间点与区间之间的最大匹配。

    将风口时间从小到大处理。处理时间 pp 时,所有满足 sips_i\le p 且尚未处理的猪都已经可以使用该风口。删除其中满足 ti<pt_i<p 的猪,因为它们以后也不可能再匹配。若仍有候选,应把当前风口分配给结束时间最早的猪。

    正确性证明

    考虑当前最早的尚未处理风口 pp。若没有清醒的猪可用,跳过它显然不会减少最优答案。否则设贪心选择的猪为 aa,其结束时间最早。

    任取一个最优方案。如果该方案没有使用风口 pp,而猪 aa 在方案中使用了更晚的风口,则可把猪 aa 改到 pp;如果猪 aa 未被使用,则直接让它使用 pp,不会使答案变差。若该方案把 pp 分配给另一只猪 bb,而猪 aa 使用了更晚的风口 qq,由于 tatbt_a\le t_bqtaq\le t_a,猪 bb 也能使用 qq,交换两只猪即可。若猪 aa 未使用,则用 aa 替换 bb 即可。

    因此总存在一个最优方案与贪心在当前风口的选择一致。逐个风口重复上述交换,可知贪心得到最大匹配数。

    做法

    按开始时间排序所有猪,按时间排序所有风口。扫描风口时,将开始时间不晚于当前风口的猪的结束时间加入小根堆,先弹出已经结束的猪,再取堆顶完成一次匹配。

    复杂度

    排序与堆操作的总时间复杂度为 O((n+m)logm)O((n+m)\log m),空间复杂度为 O(m)O(m)

    • 1

    信息

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