Problem
【JSOI2010】Frozen Nova 冷冻波
Time Limit:
Memory Limit:
Description
喜欢“魔兽争霸”这个游戏。在游戏中,巫妖是一种强大的英雄,它的技能每次可以杀死一个小精灵。我们认为,巫妖和小精灵都可以看成是平面上的点。 当巫妖和小精灵之间的直线距离不超过,且巫妖看到小精灵的视线没有被树木阻挡(也就是说,巫妖和小精灵的连线与任何树木都没有公共点)的话,巫妖就可以瞬间杀灭一个小精灵。 在森林里有个巫妖,每个巫妖释放之后,都需要等待一段时间,才能再次施放。不同的巫妖有不同的等待时间和施法范围,但相同的是,每次施放都可以杀死一个小精灵。 现在巫妖的头目想知道,若从时刻开始计算,至少需要花费多少时间,可以杀死所有的小精灵?
Input
输入文件第一行包含三个整数,分别代表巫妖的数量、小精灵的数量和树木的数量。 接下来行,每行包含四个整数,分别代表了每个巫妖的坐标、攻击范围和施法间隔(单位为秒)。 再接下来行,每行两个整数,分别代表了每个小精灵的坐标。 再接下来K行,每行三个整数,分别代表了每个树木的坐标。 输入数据中所有坐标范围绝对值不超过,半径和施法间隔不超过。
Output
输出一行,为消灭所有小精灵的最短时间(以秒计算)。如果永远无法消灭所有的小精灵,则输出。
Sample Input
1 | 2 3 1 |
Sample Output
1 | 5 |
标签:二分
最大流
Solution
这种是常见套路。类似。
二分时间,对于每个时间,判断是否足够消灭所有敌人。
建模:
对于每个巫妖,建边 权值为
对于每个精灵,建边 权值为
对于每组两个能攻击到的巫妖和精灵,建边 权值为
在次图上跑最大流,判断最大流是否等于m,即是否所有小精灵都有匹配的巫妖。
预处理每个巫妖和每个小精灵之间是否能看到,即用点到直线距离判断树木所在的圆是否与巫妖所在点和小精灵所在点两点连成线段有交点,有则不能看到。具体见代码。
Code
(我预处理的计算几何部分较为复杂,可以参考hzwer的代码,要简洁一些。)
1 |
|