题意简述
平面直角坐标系上有$m(<=800)$个点,每个点的$x$坐标都在$[1,n]$之内,$n<=1000$,$y$坐标$<=1e5$。每个点珂以设一个半径为$r$的攻击塔(攻击范围包含边界)。$x$轴上$[1,n]$的区域是敌人的进攻线,请你在每个位置都设置一些防御塔,使得敌人无法在$y$坐标上无限增大(敌人珂以各种绕路),并且$r$的最大值最小。
思路简述
抽象成图。边权为两个点之间的距离/2。设置起点S,S到一个点的距离为这个点的$x$坐标。设置终点T,T到一个点的距离为n-这个点的$x$坐标。从S到T跑最短路,路径的长度定义为路径上所有边权的最大值。
具体思路
如果我们的最大半径为$r$,那么肯定每个点都要设置半径$r$。反正半径又不花钱,那肯定往大里放啊。
然后对于一个点$u,v$,设距离为$d$。那么,两边都设置半径为$d/2$就能覆盖$u,v$之间的部分了。
当然,我们的目的是封锁$y$轴。稍微转化一下,就是要从左到右完美的封锁出“一条”来。“一条”珂以是曲线,看起来还很粗,只要不空出来即珂。因为敌人走位随便走,你只要一点空出来,敌人钻过去,就珂以无限向$y$轴延伸了。
所以,我们还要建立两个点,表示左边界和右边界。就是上面说的S和T。要说几何意义,就是S:直线x=0,T:直线x=n。然后S到一个点显然需要半径为这个点的x坐标值,才能封锁这个点到S的范围。T同理。
然后,对于我们从S到T,也就是从左到右,选择的一条链上,一个空位也不能有,也就是每个空都要完美的守住。所以这条链的长度就是最长边的值。
这样跑一遍最短路即珂。记得边权是实数,而不是整数。
代码
1 |
|