BZOJ 3007 解救小云公主 二分答案+对偶图
题目大意:给定一个矩形和矩形内的一些点。求一条左下角到右上角的路径。使全部点到这条路径的最小距离最大
最小距离最大。果断二分答案
如今问题转化成了给定矩形中的一些圆形障碍物求左下角和右上角是否连通
然后就是对偶图的问题了
左下角和右上角连通等价于对偶图中左上两条边和右下两条边不连通
因此将全部相交的圆之间连边,从左上两条边广搜就可以
时间复杂度O(n^2log(min(r,l)/EPS))
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 3030
#define S 0
#define T (n+1)
using namespace std;
struct Point{
double x,y;
friend istream& operator >> (istream &_,Point &p)
{
scanf("%lf%lf",&p.x,&p.y);
return _;
}
friend double Distance(const Point &p1,const Point &p2)
{
return sqrt( (p1.x-p2.x)*(p1.x-p2.x) + (p1.y-p2.y)*(p1.y-p2.y) );
}
}pos,points[M];
struct abcd{
int to,next;
}table[M*M];
int head[M],tot;
int n;
double dis[M][M];
void Initialize()
{
memset(head,0,sizeof head);
tot=0;
}
void Add(int x,int y)
{
table[++tot].to=y;
table[tot].next=head[x];
head[x]=tot;
}
bool BFS()
{
static int q[M];
static bool v[M];
int i,r=0,h=0;
memset(v,0,sizeof v);
v[S]=true;q[++r]=S;
while(r!=h)
{
int x=q[++h];
for(i=head[x];i;i=table[i].next)
if(!v[table[i].to])
{
v[table[i].to]=true;
q[++r]=table[i].to;
if(table[i].to==T)
return true;
}
}
return false;
}
bool Judge(double r)
{
int i,j;
Initialize();
for(i=1;i<=n;i++)
{
if( points[i].x-1<r || pos.y-points[i].y<r )
Add(S,i);
if( points[i].y-1<r || pos.x-points[i].x<r )
Add(i,T);
}
for(i=1;i<=n;i++)
for(j=1;j<i;j++)
if( dis[i][j]<2*r )
Add(i,j),Add(j,i);
return !BFS();
}
double Bisection()
{
double l=0,r=min(pos.x-1,pos.y-1);
while(r-l>1e-4)
{
double mid=(l+r)/2.0;
if( Judge(mid) )
l=mid;
else
r=mid;
}
return (l+r)/2.0;
}
int main()
{
int i,j;
cin>>n>>pos;
for(i=1;i<=n;i++)
cin>>points[i];
for(i=1;i<=n;i++)
for(j=1;j<i;j++)
dis[i][j]=Distance(points[i],points[j]);
printf("%.2lf\n", Bisection() );
}
BZOJ 3007 解救小云公主 二分答案+对偶图的更多相关文章
- 【BZOJ3007】拯救小云公主 二分+几何+对偶图
[BZOJ3007]拯救小云公主 Description 英雄又即将踏上拯救公主的道路…… 这次的拯救目标是——爱和正义的小云公主. 英雄来到boss的洞穴门口,他一下子就懵了 ...
- bzoj3007 解救小云公主
3007: 解救小云公主 Time Limit: 5 Sec Memory Limit: 512 MB Submit: 159 Solved: 71 [id=3007" style=&q ...
- BZOJ:4219: 跑得比谁都快 3007: 拯救小云公主
4219: 跑得比谁都快 3007: 拯救小云公主 三角剖分的解释可以看这里:http://www.cnblogs.com/Enceladus/p/6706444.html 后一道是前一道的弱化版. ...
- 【bzoj3007】拯救小云公主 二分+对偶图+并查集
题目描述 英雄又即将踏上拯救公主的道路…… 这次的拯救目标是——爱和正义的小云公主. 英雄来到boss的洞穴门口,他一下子就懵了,因为面前不只是一只boss,而是上千只boss.当英雄意识到自己还是等 ...
- 【BZOJ】【3007】拯救小云公主
思路题 我的naive的做法是二分答案+判定是否有路径可走……但是没有正确理解[走的方向任意]这句话…… 其实就是说想咋走咋走= =360°无死角乱走…… 所以其实是个平面上的问题…… 我们可以换个方 ...
- 二分+并查集【bzoj3007】[SDOI2012]拯救小云公主
Description 英雄又即将踏上拯救公主的道路-- 这次的拯救目标是--爱和正义的小云公主. 英雄来到boss的洞穴门口,他一下子就懵了,因为面前不只是一只boss,而是上千只boss.当英雄意 ...
- 洛谷P2498 [SDOI2012]拯救小云公主 【二分 + 并查集】
题目 英雄又即将踏上拯救公主的道路-- 这次的拯救目标是--爱和正义的小云公主. 英雄来到boss的洞穴门口,他一下子就懵了,因为面前不只是一只boss,而是上千只boss.当英雄意识到自己还是等级1 ...
- bzoj3007: 拯救小云公主
Description 英雄又即将踏上拯救公主的道路…… 这次的拯救目标是——爱和正义的小云公主. 英雄来到boss的洞穴门口,他一下子就懵了,因为面前不只是一只boss,而是 ...
- 洛谷 P2498 [SDOI2012]拯救小云公主 解题报告
P2498 [SDOI2012]拯救小云公主 题目描述 英雄又即将踏上拯救公主的道路-- 这次的拯救目标是--爱和正义的小云公主. 英雄来到\(boss\)的洞穴门口,他一下子就懵了,因为面前不只是一 ...
随机推荐
- js操作元素透明度以及浏览器兼容性
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...
- TypeError: slice indices must be integers or None or have an __index__ method
由于除法/自动产生的类型是浮点型,因此出现上述错误,修正方法为,将/更改为// roi_gray_lwpCV = gray_lwpCV[y:y + h // 2, x:x + w] # 检出人脸区域后 ...
- Android学习笔记(四) JAVA基础知识回顾
一.接口 1)接口中定义的方法都是public权限,并且默认为public,而不是default. 2)接口的实现(implements)是特殊的继承,类似于父类子类的关系,可以向上转型(非常重要). ...
- js中原型和原型链
1.原型: 在JavaScript 中,对象被表现为prototype . 原型其实一直存在于我们接触过的任何一个对象. 2. Tip:在函数对象中也存在__proto__属性,但是查看函数对象的原型 ...
- Mysql5.7多源复制,过滤复制一段时间后增加复制一个库的实现方法
多源复制如果是整个实例级别的复制,那不存在下面描述的情况. 如果是对其中一个或多个主实例都是过滤复制,并且运行一段时间后,想在这个源上再增加一个库怎么实现? 主1:192.168.1.10 330 ...
- day15-模块的基础及导入
目录 模块 什么是模块 使用模块 import 循环导入问题 解决方案一 解决方案二 模块的搜索路径 Python文件的两种用途 包 导入包内包 导入包内包的模块 绝对导入与相对导入 绝对导入 相对导 ...
- NGS数据格式介绍
一般情况下,从Illumina平台上得到的测序,其数据格式是Fastq格式,可以称之为原始数据(Raw data).事实上直接的下机数据是显微拍摄得到的图像信息.但是一般都会用Bcl2Fastq软件将 ...
- Spring框架系列(七)--Spring常用注解
Spring部分: 1.声明bean的注解: @Component:组件,没有明确的角色 @Service:在业务逻辑层使用(service层) @Repository:在数据访问层使用(dao层) ...
- 05JavaScript中的事件处理
JavaScript中的事件处理 在JavaScript中,事件的发生主要是由窗口中内容变化.键盘和鼠标引起的.JavaScript在某些事件发生的时候,可以通过一些相应的事件处理器来捕获这些事件,并 ...
- Python学习-while循环练习
1.计算1-100的和 i = 1; total = 0; while i <= 100: total = total + i; i = i + 1; print(total); 2.打印出1- ...