bzoj2289: 【POJ Challenge】圆,圆,圆
Description
1tthinking随便地画了一些圆. ftiasch认为这些圆有交集(面积非零)的可能性不大。因为他实在画了太多圆,所以你被请来判断是否存在交集。
Input
第1行,一个整数 N (1 ≤ N ≤ 105), 圆的数量。
第2到 N 行: 三个整数 Xi, Yi, Ri, 圆心在 (Xi, Yi), 半径为 Ri 的圆。
Output
如果存在面积非零的交集,则输出 "YES",否则输出 "NO"。
首先可以确定如果有相交,x坐标一定在区间[max(x[i]-r[i]),min(x[i]+r[i])]内
取这个区间中点M,在直线x=M上,若所有圆在这条线上有不为0的交集则可以判断存在面积非0的交集
否则找出一对圆在x=M上不相交,若两圆相离/相切则可以判断无解,否则把区间缩小到这两个圆交集所在的x坐标区间递归计算
每次缩小区间至少缩小一半,且圆的坐标和半径是整数,因此复杂度是可以保证的
#include<cstdio>
#include<cmath>
#include<cstdlib>
using namespace std;
typedef double ld;
const ld _0=1e-6l;
const int N=;
int n;
ld x[N],y[N],r[N];
ld L,R;
int read(){
int x=,c=getchar(),f=;
while(c>||c<){if(c=='-')f=-;c=getchar();}
while(c>&&c<)x=x*+c-,c=getchar();
return x*f;
}
void get(int id,ld X,ld&a,ld&b){
X-=x[id];
X=sqrt(r[id]*r[id]-X*X);
a=y[id]-X;
b=y[id]+X;
}
bool chk(ld X,int a,int b){
if(fabs(X-x[a])>r[a]||fabs(X-x[b])>r[b])return ;
ld a1,a2,b1,b2;
get(a,X,a1,a2);
get(b,X,b1,b2);
return a2>b1&&a1<b2;
}
void chk(int a,int b){
ld xd=x[b]-x[a],yd=y[b]-y[a];
ld d=sqrt(xd*xd+yd*yd);
if(d+_0>r[a]+r[b]){
puts("NO");
exit();
}
ld s=(r[a]+r[b]+d)/.;
ld h=*sqrt(s*(s-r[a])*(s-r[b])*(s-d))/d;
ld m=x[a]+xd*sqrt(r[a]*r[a]-h*h)/d,c=h*fabs(yd)/d;
if(d*d+r[a]*r[a]<r[b]*r[b])m=x[a]*-m;
ld lx=m-c,rx=m+c;
if(lx>x[a]-r[a]&&chk(x[a]-r[a]+_0,a,b))lx=x[a]-r[a];
if(lx>x[b]-r[b]&&chk(x[b]-r[b]+_0,a,b))lx=x[b]-r[b];
if(rx<x[a]+r[a]&&chk(x[a]+r[a]-_0,a,b))rx=x[a]+r[a];
if(rx<x[b]+r[b]&&chk(x[b]+r[b]-_0,a,b))rx=x[b]+r[b];
if(lx>L)L=lx;
if(rx<R)R=rx;
}
int main(){
n=read();
for(int i=;i<n;i++){
x[i]=read();
y[i]=read();
r[i]=read();
}
L=x[]-r[],R=x[]+r[];
for(int i=;i<n;i++){
if(L<x[i]-r[i])L=x[i]-r[i];
if(R>x[i]+r[i])R=x[i]+r[i];
}
while(){
if(L+_0>R){
puts("NO");
return ;
}
ld M=(L+R)/.;
ld y1,y2,a1,a2;
get(,M,y1,y2);
for(int i=;i<n;i++){
get(i,M,a1,a2);
if(a1>y1)y1=a1;
if(a2<y2)y2=a2;
if(y1+_0>y2){
for(int j=;j<i;j++){
get(j,M,y1,y2);
if(y1>=a2-_0||y2<=a1+_0){
chk(i,j);
goto re;
}
}
}
}
puts("YES");
return ;
re:;
}
}
bzoj2289: 【POJ Challenge】圆,圆,圆的更多相关文章
- bzoj 2295: 【POJ Challenge】我爱你啊
2295: [POJ Challenge]我爱你啊 Time Limit: 1 Sec Memory Limit: 128 MB Description ftiasch是个十分受女生欢迎的同学,所以 ...
- 【链表】BZOJ 2288: 【POJ Challenge】生日礼物
2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 382 Solved: 111[Submit][S ...
- BZOJ2288: 【POJ Challenge】生日礼物
2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 284 Solved: 82[Submit][St ...
- BZOJ2293: 【POJ Challenge】吉他英雄
2293: [POJ Challenge]吉他英雄 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 80 Solved: 59[Submit][Stat ...
- BZOJ2287: 【POJ Challenge】消失之物
2287: [POJ Challenge]消失之物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 254 Solved: 140[Submit][S ...
- BZOJ2295: 【POJ Challenge】我爱你啊
2295: [POJ Challenge]我爱你啊 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 126 Solved: 90[Submit][Sta ...
- BZOJ2296: 【POJ Challenge】随机种子
2296: [POJ Challenge]随机种子 Time Limit: 1 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 114 Solv ...
- BZOJ2292: 【POJ Challenge 】永远挑战
2292: [POJ Challenge ]永远挑战 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 513 Solved: 201[Submit][ ...
- BZOJ 2287: 【POJ Challenge】消失之物( 背包dp )
虽然A掉了但是时间感人啊.... f( x, k ) 表示使用前 x 种填满容量为 k 的背包的方案数, g( x , k ) 表示使用后 x 种填满容量为 k 的背包的方案数. 丢了第 i 个, 要 ...
- 2292: 【POJ Challenge 】永远挑战
2292: [POJ Challenge ]永远挑战 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 553 Solved: 230[Submit][ ...
随机推荐
- 平衡二叉树(Balanced Binary Tree)
平衡二叉树(Balanced Binary Tree)/AVL树:
- ubuntu 登录循环
星期一大清早一来,就出现这毛病.折腾了办个多小时,终于搞定: 我的原因:上周五的时候为了装hive改动了/etc/enviroment里面的东西,导致出错. 解决办法:1.Ctrl + Alt + F ...
- 修改Myecclipse servlet/jsp的默认模板
点击图片下载模板: 用winrar等打开myeclipse安装目录下的com.genuitec.eclipse.wizards*.jar,替换响应文件. 详细版:http://www.cnblogs. ...
- Linux驱动设计——字符杂项设备
杂项设备 linux里面的misc杂项设备是主设备号为10的驱动设备,misc设备其实也就是特殊的字符设备,可自动生成设备节点. 定义头文件<linux/miscdevice.h> 杂 ...
- NetStatusEvent info对象的状态或错误情况的属性
代码属性 级别属性 意义 "NetStream.Buffer.Empty" "status" 数据的接收速度不足以填充缓冲区.数据流将在缓冲区重新填充前中 ...
- libGraphicsMagickWand.so: cannot open shared object file: No such file or directory stack traceback:
参考博文:http://www.linuxidc.com/Linux/2016-07/133213.htm ==>> Check Passed, the num of bbox and f ...
- JSBinding + SharpKit / 实战:转换 2DPlatformer
最后修改:2015年07月29日 2016年2月25日 2DPlatformer 是 Unity3D 的一个官方 Demo.本文将介绍使用 JSBinging + SharpKit 转换 2DPlat ...
- Unity Meshes
1. Unity 没有自带建模工具 2. 导入 Mesh 时,Unity 会自动寻找所引用的纹理,查找文件夹名为 Textures 的.先在本目录下找 -> 上溯在parent查找 ==> ...
- jquery easyui DataGrid
Easyui Demo网站: http://www.jeasyui.com/ 英文 http://www.phptogether.com/juidoc/ 中文 datagrip的基本属性方法:ht ...
- OpenJudge计算概论-文字排版
/*====================================================================== 文字排版 总时间限制: 1000ms 内存限制: 65 ...