问題描述

小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(玄学建边 最小生成树)的更多相关文章

  1. CSP模拟赛游记

    时间:2019.10.5 考试时间:100分钟(连正式考试时间的一半还没有到)题目:由于某些原因不能公开. 由于第一次接触NOIinux系统所以连怎么建文件夹,调字体,如何编译都不知道,考试的前半小时 ...

  2. 【CSP模拟赛】Confess(数学 玄学)

    题目描述 小w隐藏的心绪已经难以再隐藏下去了.小w有n+ 1(保证n为偶数)个心绪,每个都包含了[1,2n]的一个大小为n的子集.现在他要找到隐藏的任意两个心绪,使得他们的交大于等于n/2. 输入描述 ...

  3. 【csp模拟赛4】基站建设 (station.cpp)

    [题目描述] 小 Z 的爸爸是一位通信工程师,他所在的通信公司最近接到了一个新的通 信工程建设任务,他们需要在 C 城建设一批新的基站. C 城的城市规划做得非常好,整个城市被规整地划分为 8 行 8 ...

  4. 【CSP模拟赛】Freda的迷宫(桥)

    题目描述 Freda是一个迷宫爱好者,她利用业余时间建造了许多迷宫.每个迷宫都是由若干房间和走廊构成的,每条走廊都连接着两个不同的房间,两个房间之间最多只有一条走廊直接相连,走廊都是双向通过.  黄昏 ...

  5. 2019/11/12 CSP模拟赛&&考前小总结

    写在前面的总结 离联赛只有几天了,也马上就要回归文化课了. 有点舍不得,感觉自己的水平刚刚有点起色,却又要被抓回文化课教室了,真想在机房再赖几天啊. 像19/11/11那场的简单题,自己还是能敲出一些 ...

  6. CSP模拟赛2游记

    这次由于有课迟到30min,了所以只考了70min. 调linux配置调了5min,只剩下65min了. T1:有点像标题统计,但要比他坑一点,而且我就被坑了,写了一个for(int i=1;i< ...

  7. 【NOIP模拟赛】chess 建图+spfa统计方案数

    似乎弗洛伊德和迪杰斯特拉都干不了统计方案数,spfa的话就是不断入队就好. #include <cstdio> #include <cstring> #include < ...

  8. 【CSP模拟赛】Freda的旗帜

    题目描述  要开运动会了,Freda承担起了制作全校旗帜的工作.旗帜的制作方法是这样的:Freda一共有C种颜色的布条,每种布条都有无数个,你可以认为这些布条的长.宽.厚都相等,只有颜色可能不同.每个 ...

  9. 【CSP模拟赛】Adore(状压dp 二进制)

    题目描述 小w偶然间见到了一个DAG.这个DAG有m层,第一层只有一个源点,最后一层只有一个汇点,剩下的每一层都有k个节点.现在小w每次可以取反第i(1<i<n-1)层和第i+1层之间的连 ...

随机推荐

  1. Centos复制的系统无法获取IP地址

    本文主要是解决自己玩虚拟机时遇到的问题,网上查询了很多资料,最好综合多方的资料进行如下总结,如果无法解决您得问题,不要着急慢慢梳理总会解决的,加油~~~ 1.添加一块新的虚拟机的网卡2.删除rm -r ...

  2. Git撤销add、commit

    撤销add git status 查看当下更新的文件 git reset HEAD 表示撤销上次add的所有文件 git reset HEAD dir/dir/test.php 撤销指定文件 撤销co ...

  3. vue从零开始(三)指令

    v-bind的使用 <!-- 绑定一个属性 --> <img v-bind:src="imageSrc"> <!-- 动态特性名 (2.6.0+) - ...

  4. OC中并发编程的相关API和面临的挑战

    OC中并发编程的相关API和面临的挑战(1) 小引 http://www.objc.io/站点主要以杂志的形式,深入挖掘在OC中的最佳编程实践和高级技术,每个月探讨一个主题,每个主题都会有几篇相关的文 ...

  5. IDEA下创建Spring项目

    IDEA下创建Java SE Spring项目示例 1.创建项目 第4步:是否自动创建空的Spring容器配置文件,默认文件名是spring-config.xml.勾不勾选都行,如果没勾选,后面要自己 ...

  6. Alpha_4

    一. 站立式会议照片 二. 工作进展 (1) 昨天已完成的工作 a. 我的·主界面设计 b. 番茄钟的页面及音乐选择弹窗页面设计 c. 实现自定义习惯和设置新习惯的功能页面,并可预览 d.已实现番茄钟 ...

  7. VS调试 DataTable (转载)

    调试的时候遇到一个问题:不知道怎么在自动窗口或者添加监视那里查看DataSet或者DataTable的具体的值.度娘了一下很多都是添加DataTable.Rows[][]监视,但是一行一列地看还是有点 ...

  8. emqx配置ssl

    1.生产自签证书 mkdir /etc/emqttd/certs/ && cd /etc/emqttd/certs/ openssl genrsa -out ca-key.pem 20 ...

  9. 【快捷键】印象笔记Markdown快捷键

    新建 Markdown 笔记 CMD+D 粗体 CMD+B 斜体 CMD+I 删除线 CMD+S 分隔线 CMD+L 编号列表 CMD+Shift+O 项目符号列表 CMD+Shift+U 插入待办事 ...

  10. termux 为 python3 添加 numpy 库

    1 本机环境 Termux v0.77 python3.8 2 配置步骤 2.1 安装 python 和 ipython apt updateapt upgradepkg install python ...