1 条题解
-
0
自动搬运
来自洛谷,原作者为

鏡音リン
希望大家都能成为自己想要的样子呐搬运于
2025-08-24 22:25:04,当前版本为作者最后更新于2021-01-28 18:27:03,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
简要题意:一个环上有 个点,给定了 个环上区间,求在这些区间中最少选择多少个可以覆盖环上所有的点,或判断无解。只输出最小值。
考虑一个弱化版的问题:把环改为链,应该怎么做。可以使用贪心算法:假如当前选择的区间已经覆盖了前 个点,为了覆盖第 个点,一定要再选择一个左端点小于等于 的区间。那么我们加入一个左端点小于等于 ,且右端点位置最大的区间,这样能尽可能覆盖最多的点,一定是最优的。此时把 更新为这个右端点的位置。初始时令 ,不断重复这个过程选择加入的区间,直到 时终止循环。若某一次选择区间后 仍不变,说明第 个点不可能被覆盖,无解。对每个 预处理出左端点小于等于 的所有区间中最大的右端点位置,就可以用 的时间预处理, 选择区间,总时间复杂度 解决这个问题。
扩展一下上面的问题:仍然是链,有多次询问,每次给定一个区间 ,询问覆盖区间中所有点的答案。上面的算法可以很自然地扩展到询问一个区间的情况:把 的初始值改为 ,终止条件改为 即可。为了优化多次询问的时间复杂度,可以使用倍增:用 表示已经覆盖了前 个点,按照上述方法再选择 个区间,能够覆盖前多少个点。对所有 预处理出 。然后倍增二分,从 到 枚举 ,如果当前 就选择这 个区间,并令 。最后若 则再选择一个区间,过程中判断无解的情况。时间复杂度可以做到 预处理, 处理单次询问。
回到环上的问题来。在任意两个相邻点之间破环成链,不妨选择方便实现的点 和点 之间。对于所有经过这一分割点的区间,设这个区间是 ,把它们记录下来,然后添加 和 两个区间。添加这两个区间并不会使答案发生变化。添加之后,一定有一组最优解包含至多一个经过分割点的区间。证明如下:如果一组最优解包含两个经过分割点的区间 和 ,把这两个区间改为后添加的 和 两个区间,仍然能覆盖所有的点,这仍然是一组最优解。如果还有超过一个经过分割点的区间,就继续这样做,最终一定能得到一组包含至多一个经过分割点的区间的最优解。
那么,我们可以枚举选择的经过分割点的区间是哪个,若为 ,用上面的算法求出链上覆盖 中的点需要选择多少区间,并更新最小值。注意也可以不选择经过分割点的区间。总体时间复杂度 。
- 1
信息
- ID
- 6050
- 时间
- 4000ms
- 内存
- 1024MiB
- 难度
- 5
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者