博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二分+并查集【bzoj3007】[SDOI2012]拯救小云公主
阅读量:5066 次
发布时间:2019-06-12

本文共 2030 字,大约阅读时间需要 6 分钟。

Description

英雄又即将踏上拯救公主的道路……

这次的拯救目标是——爱和正义的小云公主。

英雄来到boss的洞穴门口,他一下子就懵了,因为面前不只是一只boss,而是上千只boss。当英雄意识到自己还是等级1的时候,他明白这就是一个不可能完成的任务。

但他不死心,他在想,能不能避开boss去拯救公主呢,嘻嘻。

Boss的洞穴可以看成一个矩形,英雄在左下角(1,1),公主在右上角(row,line)。英雄为了避开boss,当然是离boss距离越远越好了,所以英雄决定找一条路径使到距离boss的最短距离最远。

Ps:英雄走的方向是任意的。

你可以帮帮他吗?

当英雄找到了美丽漂亮的小云公主,立刻就被boss包围了!!!英雄缓闭双眼,举手轻挥,白光一闪后使用了回城卷轴,回到了城堡,但只有小云公主回去了……因为英雄忘了进入回城的法阵了。

Input

第一行,输入三个整数,n表示boss的数目,row,line表示矩形的大小;

接下来n行,每行分别两个整数表示boss的位置坐标。

Output

输出一个小数,表示英雄的路径离boss的最远距离,精确到小数点后两位。

这里的距离指的是欧几里德距离

首先很容易看出是二分答案

我们可以看成是以每个\(boss\)为圆心作一个半径为\(r\)的圆,我们想要求的就是让这些圆尽可能大,并且不能影响我们从\((1,1)\)\((n,m)\)。(不能覆盖)

直接考虑边界条件\((n,1)\)\((1,m)\)如果这两个点没有被覆盖,那我必然可以到达\((n,m)\)

PS:这里的判断条件不是同时判断。

这样用\(||\)判断,可以达到我们边界不被封锁的情况。

并查集维护连通即可。

代码

#include
#include
#include
#include
#define eps 1e-4#define R registerusing namespace std;const int gz=3e3+8;inline void in(R int &x){ R int f=1;x=0;char s=getchar(); while(!isdigit(s)){if(s=='-')f=-1;s=getchar();} while(isdigit(s)){x=x*10+s-'0';s=getchar();} x*=f;}int nn,n,m,f[gz];struct cod{ int x,y;}bos[gz];int find(R int x){return f[x]==x?x:f[x]=find(f[x]);}inline double xx(R double x){ return x*x;}inline double dis(R int i,R int j){ return xx(bos[i].x-bos[j].x)+xx(bos[i].y-bos[j].y);}inline bool ok(R double r){ for(R int i=0;i<=nn+1;i++)f[i]=i; for(R int i=1;i<=nn;i++) { for(R int j=1;j
=m) { R int fa=find(i),fb=find(0); if(fa!=fb)f[fa]=fb; } if(bos[i].x+r>=n or bos[i].y-r<=1) { R int fa=find(i),fb=find(nn+1); if(fa!=fb)f[fa]=fb; } } return find(0)!=find(nn+1);}int main(){ in(nn),in(n),in(m); for(R int i=1;i<=nn;i++) in(bos[i].x),in(bos[i].y); R double ll=0,rr=min(n,m); while(fabs(ll-rr)>eps) { R double mid=(ll+rr)/2; if(ok(mid))ll=mid; else rr=mid; } printf("%.2f",ll);}

转载于:https://www.cnblogs.com/-guz/p/9975749.html

你可能感兴趣的文章
几款Http小服务器
查看>>
iOS 数组排序
查看>>
第三节
查看>>
PHP结合MYSQL记录结果分页呈现(比较实用)
查看>>
Mysql支持的数据类型
查看>>
openSuse beginner
查看>>
Codeforces 620E(线段树+dfs序+状态压缩)
查看>>
Windows7中双击py文件运行程序
查看>>
Market entry case
查看>>
css3动画属性
查看>>
Mongodb 基本命令
查看>>
控制文件的备份与恢复
查看>>
软件目录结构规范
查看>>
mysqladmin
查看>>
解决 No Entity Framework provider found for the ADO.NET provider
查看>>
设置虚拟机虚拟机中fedora上网配置-bridge连接方式(图解)
查看>>
[置顶] Android仿人人客户端(v5.7.1)——人人授权访问界面
查看>>
ES6内置方法find 和 filter的区别在哪
查看>>
Android实现 ScrollView + ListView无滚动条滚动
查看>>
java学习笔记之String类
查看>>