洛谷-1783 海滩防御

来源:互联网 发布:淘宝客服怎么做兼职 编辑:程序博客网 时间:2024/04/18 17:48

题目描述

WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和仓库总是被敌方派人偷袭。于是,WLP动用了他那丰满且充实的大脑(或许更偏向前者),想出了一个好主意,他把海滩分成垂直于海岸线的若干列,在其中的几列上放置几个信号塔,试图来监视整个海滩。然而,WLP是一个非常心急的人,他把信号塔建好后才发现还需给信号塔供能,它们才能投入使用(这不是废话么),它们都有一个工作半径,一个圆形区域里的所有敌人都逃不过它们的监视,不过,WLP发现,敌人们非常狡猾,除非他将道路完全封死,否则WLP的敌人可以走过一条任意弯曲的路(不一定走整点,但是不会出第0列和第N列构成的边界)来偷他的东西。

于是,WLP就思考了:到底需要给每个信号塔多大的工作半径,才能将从海滩到内地的路径完全封死呢?他再次动用了他那丰满且充实的大脑,想了一堂数学课,终于,还是没想出来。于是,他向LZZ神犇求助(额……C_SUNSHINE的身份是不是暴露了)。

终于,在WLP:“%^!@#!(^!#@$^&(此处省略无数卖萌场景)”的哀求下,LZZ神犇写了一个程序,在1s内就解决了问题。但是,邪恶的LZZ神犇决定要将这个难题共享给无数无辜的OIer,所以,现在轮到你了。

输入输出格式

输入格式:

第一行两个整数N和M:表示海滩被WLP分成的列数0-N和信号塔个数。

第2-M+1行:每行两个数Xi,Yi表示1-M号信号塔所在的列数和离开海滩的距离。

输出格式:

一行一个实数,表示最小的工作半径,保留两位小数。

输入输出样例

输入样例#1:

【输入样例1】
5 5
1 5
3 5
5 5
4 30
2 15

【输入样例2】
100 2
30 50
90 100

输出样例#1:

【输出样例1】
1.00

【输出样例2】
39.05

说明

对于10%的数据:1≤M≤10,1≤Yi≤100;

对于30%的数据:1≤M≤50,1≤Yi≤1,000;

对于80%的数据:1≤M≤500,1≤Yi≤1,000;

对于100%的数据:1≤M≤800,1≤N≤1000,1≤Xi≤N,1≤Yi≤100,000.

【样例解释】

注意,封锁海滩是指,敌人的深入程度是有限制的,若敌人绕过了所有的信号塔,并且可以长驱直入,那么就说明道路没有完全封锁。

题意概要

好像题面说得很清楚,就是说要保证敌人不能穿越信号塔所监控的范围

思路

把题面概括一下

信号塔要组成一条封锁线

信号塔的监控范围(比学校的监控系统还大)可以连起左右两边的边界

信号塔之间的连线会连起整个地球(生成树?)

再来看看数据范围,n<=1000,一看十有八九是O(n^2)的复杂度

最终就像kruscarl一样把所有小边连起来,不过在此之前,要将左边界和右边界浓缩成一点,所有信号塔与边界间的距离是x坐标绝对值,信号塔间的距离就是曼哈顿距离,一旦并查集查到左右边界联通,马上结束循环,输出当前值

虽说单个数据是O(n^2)的复杂度,有T组数据,n<=1000,T<=800的数据还是要卡卡常的,但是不用卡得太厉害了,毕竟出题人良心,并且洛谷数据水,循环很快就可以弹出来,放心AC

突然间发现自己开始将做题中心从"普及+ 提高"转到"提高+ 弱省省选"了
算是一个OI生涯的一条小分界线吧

原创粉丝点击