题目链接:点击查看
题目大意:将数轴视为跑道,现在有数个学生正在跑步,每个学生都有四个相关属性:
- 起始时间
- 停止时间
- 起始位置
- 方向(正向,反向)
现在给出 n 处监控,每处监控在第 t 秒第 x 个位置拍到了至少一个学生,问最少需要多少个学生进行跑步,才能满足 n 处监控的条件
题目分析:因为跑道的范围是 1 ~ 1e9 ,所以贪心可以得出,因为需要让尽量少的学生进行跑步,所以每个学生尽量跑更多的路,可以使得被更多的监控拍到,这样我们不妨直接设所有跑步的学生为两类,一类是从点 0 出发正向跑,另一类是从点 1e9 出发倒着跑
那么对于监控中拍到的人,因为监控是在 ( t , x ) 的条件下拍到的,换句话说,这个人,可以是第 t - x 秒从点 0 出发正着跑的那个人,也可以是第 t - ( 1e9 - x ) 秒从点 1e9 出发倒着跑的那个人
如此一来就将问题转换为二分图的最小点覆盖问题了,首先引用一下最小点覆盖的定义(来自大蓝书)
最小点覆盖:给定一张二分图,求出一个最小的点集S,使得图中任意一条边都有至少一个端点属于S。
在这个题目中,每条边代表的是每个监控的信息,每个点代表的是跑步的学生,这样一来,最小点覆盖的定义与本题就对应起来了:求出最少跑步的学生,使得所有的监控条件都满足
不过本题中 n 和 m 都是 1e5 的级别,朴素的求最小点覆盖的算法是匈牙利算法,时间复杂度是 n * n 的,所以我们需要用网络流将其优化为 msqrt( n ) 的时间复杂度才行
代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include