【CSP模拟赛】starway(玄学建边 最小生成树)
问題描述
小w伤心的走上了 Star way to heaven。
到天堂的道路是一个笛卡尔坐标系上一个n×m的长方形通道(顶点在(0,0))和(n,m)),小w从最左边任意一点进入,从右边任意一点走到天堂。
最左最右的距离为n,上下边界距离为m。
其中长方形内有k个Star,每个Star都有一个整点坐标,Star的大小可以忽略不计,
每个Star以及长方形上下两个边缘(宇宙的边界)都有引力,所以为了成功到达heaven小w离他们越远越好。
请问小V走到终点的路径上,距离所有星星以及边界的最小距离最大值可以为多少?
输入格式
一行三个整数n,m,k。
接下来k行,每行两个整数xi,yi表示一个点的坐标。
输出格式
一行一个整数表示答案,绝对误差不能超过10-6。
输入样例
10 5 2
1 1
2 3
输出样例
1.11803399
对于100%的数据 $k\leq 6000 ,n,m\leq 10^6$
分析
没什么好分析的,noi.ac上的原题都不会做了,可见这个Oier有多菜
根据套路,题目中说到最小距离最大,我们考虑二分这个最小距离然后检验
设最小距离为len
对于一个点,如果到它的最小距离为len,那么以它为圆心,len为半径形成的圆就是雷区,是不能进入的
对于一条线,雷区就是一个贼长的矩形
下图是len为1时样例的雷区

显然,如果小w只走白色区域就可以从左边走到右边,那么这个len就是可以在增加一些的
那么如何判断这些雷区可以封死小w走的路呢?
我们来看一下封死的情况,让len为$\sqrt 2$

如果把上下边界也看成点,距离小于len*2的点连边

我们发现,若是上下两个边界联通了,就从左边到右边的路就被封死了。
于是我们可以二分len然后O(n^2)连边,O(n)判定,复杂度为O(nlogn)
不过6000的数据还是过不了。
由联通,所以想到最小生成树,在最小生成树中,从下边界到上边界路径上最长的边应该就是限制上下边界联通的边,拿它除以2就是答案
然而身为年度憨憨人物的我忘了prim只记得kruskal,暴力最小生成树
prim的时间复杂度为O(n^2),kruskal的时间复杂度为O(mlogm),此题m=n^2
所以选择prim算法。
如果怕精度问题可以用longlong存下距离的平方
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,k,vis[],pre[],p[][];long long d[],ans;
long long dis(int a,int b){return 1ll*(p[a][]-p[b][])*(p[a][]-p[b][])+1ll*(p[a][]-p[b][])*(p[a][]-p[b][]);}
int main()
{
scanf("%d%d%d",&n,&m,&k);d[k+]=1ll*m*m;
for(int i=;i<=k;i++)scanf("%d%d",&p[i][],&p[i][]),d[i]=1ll*p[i][]*p[i][];
for(int i=;i<=k+;i++)
{
int nx=;long long mn=1000000000000ll;
for(int j=;j<=k+;j++)if(d[j]<=mn&&!vis[j])mn=d[nx=j];
if(nx==k+){d[nx]=ans=mn;break;}vis[nx]=;
for(int j=;j<=k+;j++)
if(j==k+)
pre[j]=d[j]>1ll*(m-p[nx][])*(m-p[nx][])?nx:pre[j],
d[j]=min(d[j],1ll*(m-p[nx][])*(m-p[nx][]));
else if(!vis[j]&&d[j]>dis(j,nx))d[j]=dis(j,nx),pre[j]=nx;
}
int x=k+;while(x)ans=max(ans,d[x]),x=pre[x];
printf("%.9lf\n",sqrt(ans)/2.0);
}
【CSP模拟赛】starway(玄学建边 最小生成树)的更多相关文章
- CSP模拟赛游记
时间:2019.10.5 考试时间:100分钟(连正式考试时间的一半还没有到)题目:由于某些原因不能公开. 由于第一次接触NOIinux系统所以连怎么建文件夹,调字体,如何编译都不知道,考试的前半小时 ...
- 【CSP模拟赛】Confess(数学 玄学)
题目描述 小w隐藏的心绪已经难以再隐藏下去了.小w有n+ 1(保证n为偶数)个心绪,每个都包含了[1,2n]的一个大小为n的子集.现在他要找到隐藏的任意两个心绪,使得他们的交大于等于n/2. 输入描述 ...
- 【csp模拟赛4】基站建设 (station.cpp)
[题目描述] 小 Z 的爸爸是一位通信工程师,他所在的通信公司最近接到了一个新的通 信工程建设任务,他们需要在 C 城建设一批新的基站. C 城的城市规划做得非常好,整个城市被规整地划分为 8 行 8 ...
- 【CSP模拟赛】Freda的迷宫(桥)
题目描述 Freda是一个迷宫爱好者,她利用业余时间建造了许多迷宫.每个迷宫都是由若干房间和走廊构成的,每条走廊都连接着两个不同的房间,两个房间之间最多只有一条走廊直接相连,走廊都是双向通过. 黄昏 ...
- 2019/11/12 CSP模拟赛&&考前小总结
写在前面的总结 离联赛只有几天了,也马上就要回归文化课了. 有点舍不得,感觉自己的水平刚刚有点起色,却又要被抓回文化课教室了,真想在机房再赖几天啊. 像19/11/11那场的简单题,自己还是能敲出一些 ...
- CSP模拟赛2游记
这次由于有课迟到30min,了所以只考了70min. 调linux配置调了5min,只剩下65min了. T1:有点像标题统计,但要比他坑一点,而且我就被坑了,写了一个for(int i=1;i< ...
- 【NOIP模拟赛】chess 建图+spfa统计方案数
似乎弗洛伊德和迪杰斯特拉都干不了统计方案数,spfa的话就是不断入队就好. #include <cstdio> #include <cstring> #include < ...
- 【CSP模拟赛】Freda的旗帜
题目描述 要开运动会了,Freda承担起了制作全校旗帜的工作.旗帜的制作方法是这样的:Freda一共有C种颜色的布条,每种布条都有无数个,你可以认为这些布条的长.宽.厚都相等,只有颜色可能不同.每个 ...
- 【CSP模拟赛】Adore(状压dp 二进制)
题目描述 小w偶然间见到了一个DAG.这个DAG有m层,第一层只有一个源点,最后一层只有一个汇点,剩下的每一层都有k个节点.现在小w每次可以取反第i(1<i<n-1)层和第i+1层之间的连 ...
随机推荐
- 通过创建一个简单的骰子游戏来探究 Python
在我的这系列的第一篇文章 中, 我已经讲解如何使用 Python 创建一个简单的.基于文本的骰子游戏.这次,我将展示如何使用 Python 模块 Pygame 来创建一个图形化游戏.它将需要几篇文章才 ...
- pandas-14 concatenate和combine_first的用法
pandas-14 concatenate和combine_first的用法 concatenate主要作用是拼接series和dataframe的数据. combine_first可以做来填充数据. ...
- CSS-盒模型与文本溢出笔记
注意点: 文本居中: text-align:center:文本左右居中 line-heigh:30px; 等于容器高度时,单行文本上下居中 margin:0 auto: 浏览器居中 清除margin ...
- ansible 中 JAVA_HOME不生效问题
解决方案 ~/.bash_profile 是交互式.login 方式进入 bash 运行的,意思是只有用户登录时才会生效. ~/.bashrc 是交互式 non-login 方式进入 bash 运行的 ...
- VirtualBox下设置 XP虚拟机桥接模式
virtualBox下设置虚拟机桥接模式
- CAS 的问题
cas这么好用,那么有没有什么问题呢?还真有 ABA问题 CAS需要在操作值的时候检查下值有没有发生变化,如果没有发生变化则更新,但是如果一个值原来是A,变成了B,又变成了A,那么使用CAS进行检查时 ...
- angular官网实例(综合)
第一部分: (应用的“外壳”) 1.新建项目: ng new mytest 2.进入项目目录,并启动这个应用. cd mytest ng serve --open 3.添加一个标题 打开 app.co ...
- 调用百度API返回经纬度
后台调用百度API接口生成: import java.io.BufferedReader; import java.io.IOException;import java.io.InputStreamR ...
- ExecutorService java多线程分割list运行
调用方法 int threadNum = 7; while(true) { List<FaceAnalyseImage> list = faceAnalyseImageMapper.sel ...
- Pollard-rho的质因数分解
思路:见参考文章(原理我是写不粗来了) 代码: 用到了快速幂,米勒罗宾素性检验. #include <iostream> #include <time.h> #include ...