题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2819

题目意思:

给了平面上的n条线段:

让你在x轴上[0,L]的范围内找一个点作为圆心,画一个圆,这个圆不能把线段包含在里面去。

求最大的半径。

求解:

二分最终的答案,求解。

对于二分的半径值,对每条线段找出对于x位置上满足半径要求的段。

看n条线段有没有交集就可以了。

 /* ***********************************************
Author :kuangbin
Created Time :2014/5/10 23:18:09
File Name :E:\2014ACM\区域赛练习\2010\2010SouthEastern_European_Region\C.cpp
************************************************ */ #include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std; const double eps = 1e-;
const double inf = 1e5;
const double pi = acos(-1.0);
int sgn(double x)
{
if(fabs(x) < eps)return ;
else if(x < )return -;
return ;
}
struct Point
{
double x,y;
Point(){}
Point(double _x,double _y)
{
x = _x;
y = _y;
}
void input()
{
scanf("%lf%lf",&x,&y);
}
Point operator -(const Point &b)const
{
return Point(x-b.x,y-b.y);
}
double operator *(const Point &b)const
{
return x*b.x + y*b.y;
}
double operator ^(const Point &b)const
{
return x*b.y - y*b.x;
}
double len()
{
return hypot(x,y);
}
double distance(Point p)
{
return hypot(x-p.x,y-p.y);
}
};
struct Line
{
Point s,e;
Line(){}
Line(Point _s,Point _e)
{
s = _s;
e = _e;
}
void input()
{
s.input();
e.input();
}
double length()
{
return s.distance(e);
}
double dispointtoline(Point p)
{
return fabs((p-s)^(e-s))/length();
}
double dispointtoseg(Point p)
{
if(sgn((p-s)*(e-s)) < || sgn((p-e)*(s-e)) < )
return min(p.distance(s),p.distance(e));
return dispointtoline(p);
}
};
const int MAXN = ;
Line line[MAXN]; double get(int i,double L)
{
double l = , r = L;
while(r - l >= eps)
{
double mid = (l + r)/;
double midmid = (r + mid)/;
if(line[i].dispointtoseg(Point(mid,)) < line[i].dispointtoseg(Point(midmid,)))
r = midmid - eps;
else l = mid + eps;
}
return l;
}
int n;
double L; struct Node
{
double a;
int c;
Node(double _a = ,int _c = )
{
a = _a;
c = _c;
}
};
bool cmp(Node a,Node b)
{
if(sgn(a.a - b.a) != )return a.a < b.a;
else return a.c > b.c;
} double bin1(int i,double l,double r,double R)
{
while(r-l >= eps)
{
double mid = (l+r)/;
if(line[i].dispointtoseg(Point(mid,)) <= R)
r = mid - eps;
else l = mid + eps;
}
return l;
}
double bin2(int i,double l,double r,double R)
{
while(r-l >= eps)
{
double mid = (l+r)/;
if(line[i].dispointtoseg(Point(mid,)) <= R)
l = mid + eps;
else r = mid - eps;
}
return l;
} bool gao(double r)
{
vector<Node>vec;
for(int i = ;i < n;i++)
{
double tmp = get(i,L);
if(sgn(line[i].dispointtoseg(Point(tmp,)) - r) >= )
{
vec.push_back(Node(,));
vec.push_back(Node(L,-));
continue;
}
if(sgn(line[i].dispointtoseg(Point(,)) - r) >= )
{
double tt = bin1(i,,tmp,r);
vec.push_back(Node(,));
vec.push_back(Node(tt,-));
}
if(sgn(line[i].dispointtoseg(Point(L,)) - r) >= )
{
double tt = bin2(i,tmp,L,r);
vec.push_back(Node(tt,));
vec.push_back(Node(L,-));
}
}
sort(vec.begin(),vec.end(),cmp);
int cnt = ;
for(int i = ;i < vec.size();i++)
{
cnt += vec[i].c;
if(cnt >= n)return true;
}
return false;
} double solve()
{
double l = , r = inf;
while(r-l >= eps)
{
double mid = (l+r)/;
if(gao(mid))l = mid+eps;
else r = mid - eps;
}
return l;
} int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%lf",&n,&L);
for(int i = ;i < n;i++)
line[i].input();
printf("%.3lf\n",solve());
}
return ;
}

UVALive 4818 - Largest Empty Circle on a Segment (计算几何)的更多相关文章

  1. 4818 Largest Empty Circle on a Segment (几何+二分)

    ACM-ICPC Live Archive 挺水的一道题,直接二分圆的半径即可.1y~ 类似于以前半平面交求核的做法,假设半径已经知道,我们只需要求出线段周围哪些位置是不能放置圆心的即可.这样就转换为 ...

  2. uva 1463 - Largest Empty Circle on a Segment(二分+三分+几何)

    题目链接:uva 1463 - Largest Empty Circle on a Segment 二分半径,对于每一个半径,用三分求出线段到线段的最短距离,依据最短距离能够确定当前R下每条线段在[0 ...

  3. Visulalize Boost Voronoi in OpenSceneGraph

    Visulalize Boost Voronoi in OpenSceneGraph eryar@163.com Abstract. One of the important features of ...

  4. Voronoi Diagram——维诺图

    Voronoi图定义   任意两点p 和q 之间的欧氏距离,记作 dist(p, q) .就平面情况而言,我们有           dist(p, q) =  (px-qx)2+ (py-qy)2 ...

  5. Apache Kafka – KIP 32,33 Time Index

    32, 33都是和时间相关的, KIP-32 - Add timestamps to Kafka message 引入版本,0.10.0.0 需要给kafka的message加上时间戳,这样更方便一些 ...

  6. 杭电ACM分类

    杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze ...

  7. 转载:hdu 题目分类 (侵删)

    转载:from http://blog.csdn.net/qq_28236309/article/details/47818349 基础题:1000.1001.1004.1005.1008.1012. ...

  8. BUAA_2020_软件工程_结对项目作业

    项目 内容 这个作业属于哪个课程 班级博客 这个作业的要求在哪里 作业要求 我在这个课程的目标是 掌握软件工程的思路方法 这个作业在哪个具体方面帮助我实现目标 学习结对编程 教学班级 006 项目地址 ...

  9. zw版_zw中文增强版Halcon官方Delphi例程

    [<zw版·delphi与halcon系列原创教程>zw版_zw中文增强版Halcon官方Delphi例程 源码下载:http://files.cnblogs.com/files/ziwa ...

随机推荐

  1. Oracle学习系列6

    Oracle学习系列6 ************************************************************************************ 删除约 ...

  2. Android——使用SQLiteDatabase操作SQLite数据库

    除了可以使用文件或SharedPreferences存储数据,还可以选择使用SQLite数据库存储数据. 在Android平台上,集成了一个嵌入式关系型数据库-SQLite,SQLite3支持 NUL ...

  3. Chrome渲染Transition时页面闪动Bug

    前段时间,有同事和会员反馈使用Chrome访问淘宝首页会出现画面闪动的现象,但是我在Mac和Win下面的Chrome都无法重现这个问题,后来重装了一遍Win7下的Chrome Beta版本,终于重现了 ...

  4. valgind使用错误——检测不同位目标程序

    当64位的valgrind工具测试32位的程序时,会报如下错误: ==22235== Memcheck, a memory error detector ==22235== Copyright (C) ...

  5. iframe的高度自适应

    http://www.cnblogs.com/snandy/p/3902337.html http://www.cnblogs.com/snandy/p/3900016.html Snandy Sto ...

  6. HTTP请求中的form data和request payload的区别

    HTML <form> 标签的 enctype 属性 在下面的例子中,表单数据会在未编码的情况下进行发送: <form action="form_action.asp&qu ...

  7. HA(High available)--Heartbeat高可用性集群(双机热备)菜鸟入门级

    HA(High available)--Heartbeat高可用性集群(双机热备)   1.理解:两台服务器A和B ,当A提供服务,B闲置待命,当A服务宕机,会自动切换至B机器继续提供服务.当主机恢复 ...

  8. U3D外包、Unreal4外包、VR外包就找北京动点飞扬软件

    北京动点软件长年承接Unity3D(U3D外包)项目,我们制作各类型VR/AR游戏,虚拟现实,增强现实项目! 品质保证,售后完备. 联系请加QQ:372900288  电话:13911652504 我 ...

  9. java基础要点

    Java语言是现在比较常用的编程语言,因为Java语言可以编写桌用程序,也可以编写web程序,还能编写嵌入式程序.这是由于相比脚本语言,Java 的运行速度要快.而对于底层语言,Java与平台无关,可 ...

  10. 命令别名alias设置

    <转:http://vbird.dic.ksu.edu.tw/linux_basic/0320bash_3.php> 命令别名配置: alias, unalias 命令别名是一个很有趣的东 ...