6354 Everything Has Changed
Edward is a worker for Aluminum Cyclic Machinery. His work is operating mechanical arms to cut out designed models. Here is a brief introduction of his work.
Assume the operating plane as a two-dimensional coordinate system. At first, there is a disc with center coordinates (,) and radius R. Then, m mechanical arms will cut and erase everything within its area of influence simultaneously, the i-th area of which is a circle with center coordinates (xi,yi) and radius ri (i=,,⋯,m). In order to obtain considerable models, it is guaranteed that every two cutting areas have no intersection and no cutting area contains the whole disc.
Your task is to determine the perimeter of the remaining area of the disc excluding internal perimeter.
Here is an illustration of the sample, in which the red curve is counted but the green curve is not. Input
The first line contains one integer T, indicating the number of test cases.
The following lines describe all the test cases. For each test case:
The first line contains two integers m and R.
The i-th line of the following m lines contains three integers xi,yi and ri, indicating a cutting area.
≤T≤, ≤m≤, −≤xi,yi≤, ≤R,ri≤ (i=,,⋯,m). Output
For each test case, print the perimeter of the remaining area in one line. Your answer is considered correct if its absolute or relative error does not exceed −.
Formally, let your answer be a and the jury's answer be b. Your answer is considered correct if |a−b|max(1,|b|)≤10−6. Sample Input -
- - Sample Output
81.62198908430238475376 Source
Multi-University Training Contest Recommend
chendu | We have carefully selected several similar problems for you:
板子题,注意内切要算。以及判断优劣弧的时候。用距离或者是弦的左右来判断。
我写的时候对优劣弧的定义弄反了,没改。我用的距离判断。
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define eps 1e-9
#define pi acos(-1.0)
struct point
{
double x,y;
};
struct yuan
{
point a;
double r;
};
typedef struct point point;
double xmult(point p1,point p2,point p0)
{
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}
double distance(point p1,point p2)
{
return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}
//点到直线的距离
double disptoline(point p,point l1,point l2)
{
return fabs(xmult(p,l1,l2))/distance(l1,l2);
}
//求两直线交点
point intersection(point u1,point u2,point v1,point v2)
{
point ret=u1;
double t=((u1.x-v1.x)*(v1.y-v2.y)-(u1.y-v1.y)*(v1.x-v2.x))
/((u1.x-u2.x)*(v1.y-v2.y)-(u1.y-u2.y)*(v1.x-v2.x));
ret.x+=(u2.x-u1.x)*t;
ret.y+=(u2.y-u1.y)*t;
return ret;
}
int intersect_circle_circle(point c1,double r1,point c2,double r2)
{
return distance(c1,c2)<r1+r2&&distance(c1,c2)>fabs(r1-r2);
}
void intersection_line_circle(point c,double r,point l1,point l2,point& p1,point& p2)
{
point p=c;
double t;
p.x+=l1.y-l2.y;
p.y+=l2.x-l1.x;
p=intersection(p,c,l1,l2);
t=sqrt(r*r-distance(p,c)*distance(p,c))/distance(l1,l2);
p1.x=p.x+(l2.x-l1.x)*t;
p1.y=p.y+(l2.y-l1.y)*t;
p2.x=p.x-(l2.x-l1.x)*t;
p2.y=p.y-(l2.y-l1.y)*t;
}
void intersection_circle_circle(point c1,double r1,point c2,double r2,point& p1,point& p2)
{
point u,v;
double t;
t=(+(r1*r1-r2*r2)/distance(c1,c2)/distance(c1,c2))/;
u.x=c1.x+(c2.x-c1.x)*t;
u.y=c1.y+(c2.y-c1.y)*t;
v.x=u.x+c1.y-c2.y;
v.y=u.y-c1.x+c2.x;
intersection_line_circle(c1,r1,u,v,p1,p2);
}//两圆的交点
double simahdu(point a, point b,point c,double r)
{
double d=distance(a,b)*0.5;
double pp= *asin(d/r)*r;
return pp;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
double r;
scanf("%d%lf",&n,&r);
point ww;
ww.x=;ww.y=;
double ans=2.0*pi*r;
for(int i=;i<=n;i++)
{
point qq;
double qr;
scanf("%lf%lf%lf",&qq.x,&qq.y,&qr);
int ppp= intersect_circle_circle(ww,r,qq,qr);
if(distance(qq,ww)==fabs(qr-r))
{
ans=ans+*pi*qr;
}
if(ppp==)
{
point jiao1,jiao2;
intersection_circle_circle(qq,qr,ww,r,jiao1,jiao2);
point zd;
zd.x=(jiao1.x+jiao2.x)/;
zd.y=(jiao1.y+jiao2.y)/;
double l1=distance(ww,qq);
double l2=distance(ww,zd);
double l3=distance(qq,zd);
double jiayou=simahdu(jiao1,jiao2,qq,qr);
double jialie=2.0*pi*qr-jiayou;
double jianyou=simahdu(jiao1,jiao2,ww,r);
double jianlie=2.0*pi*r-jianyou;
if(l1>l2 && l1>l3)//加优减优
{
ans=ans+jiayou-jianyou; }
else if(l3 > l2)//加优减劣
{
ans=ans+jiayou-jianlie;
}
else//加劣减优
{
ans=ans+jialie-jianyou; } }
else
{
continue;
} }
printf("%0.20lf\n",ans);
}
return ;
}
6354 Everything Has Changed的更多相关文章
- HDU 6354 Everything Has Changed(余弦定理)多校题解
题意:源点处有个圆,然后给你m个圆(保证互不相交.内含),如果源点圆和这些原相交了,就剪掉相交的部分,问你最后周长(最外面那部分的长度). 思路:分类讨论,只有内切和相交会变化周长,然后乱搞就行了.题 ...
- HDU 6354.Everything Has Changed-简单的计算几何、相交相切圆弧的周长 (2018 Multi-University Training Contest 5 1005)
6354.Everything Has Changed 就是计算圆弧的周长,总周长=大圆周长+相交(相切)部分的小圆的弧长-覆盖掉的大圆的弧长. 相交部分小圆的弧长直接求出来对应的角就可以,余弦公式, ...
- CentOS:ECDSA host key "ip地址" for has changed and you have requested strict checking(转)
原文地址:http://blog.csdn.net/ausboyue/article/details/52775281 Linux SSH命令错误:ECDSA host key "ip地址& ...
- 【异常】INFO: TopologyManager: EndpointListener changed ...
5月份做云部署,在调试CSS系统时,出现启动系统时,卡死情况,后台日志如下: May 03, 2016 2:34:52 AM org.apache.cxf.dosgi.topologymanager. ...
- tomcat 7 WARNING: A context path must either be an empty string or start with a '/' and do not end with a '/'. The path [/] does not meet these criteria and has been changed to []
tomcat 7 WARNING: A context path must either be an empty string or start with a '/' and do not end w ...
- Centos 7 mysql Buffered warning: Changed limits: max_connections: 214 解决方法
Everytime I restart MySQL I have this warning: [Warning] Buffered warning: Changed limits: max_conne ...
- WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED
原文地址:http://linuxme.blog.51cto.com/1850814/375752 今天将阿里云服务器更换了一下系统盘,重启成功后,再次通过终端访问阿里云的公网IP报以下信息: @@@ ...
- WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED解决方法
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ WARNING: REMOTE HOST IDENTIFICATION ...
- 详细!交叉编译时 note: the mangling of 'va_list' has changed in GCC 4.4解决办法
为什么要在标题前面加了详细两个字,就是为了吸引看文章的你还有写文章的我这种小白,我是从坑里面爬出来了. 废话少说.... 问题就是这样子了,至于解决办法,在网上搜索了很久,大多数以一段英文作为解决办法 ...
随机推荐
- CCF CSP 201709-1 打酱油 (贪心)
题目链接:http://118.190.20.162/view.page?gpid=T63 问题描述 试题编号: 201709-1 试题名称: 打酱油 时间限制: 1.0s 内存限制: 256.0MB ...
- Jquery小功能实例
下拉框内容选中左右移动 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Sele ...
- 爬坑系列----Redis查询key报空指针异常,而redis中确实存在该key
现象: 1.在A方法中根据key查询一个list,可以获取到相应的值 2.在B方法中同样调用此方法,传入相同的key,查询不到值,为null,报空指针异常 起初我也一脸懵逼,到现在虽然解决了,还是不知 ...
- Linux 内存泄漏检查工具 valgrind
抄自<从零开始的JSON库教程>,先mark一下,以后再慢慢研究. ======== 引用分割线 ======== 在 Linux.OS X 下,我们可以使用 valgrind 工具(用 ...
- Guitar Por如何演奏刮弦
每当我们听到吉他现场演出的时候,看到吉他手在激烈的刮弦时,都觉得很酷,非常有感染力.刮弦在我们弹吉他或编曲时,会经常用到,虽然时间很短,但会为你加分不少. 那么我们应该如何演奏刮弦呢,我们先用E5和弦 ...
- jsp中的绝对路径、相对路径和访问jsp的方式
1.jsp的绝对路径 绝对路径在复制jsp时不用修改路径都会正常显示,但是绝对路径${pageContext.request.contextPath}只有jsp可以识别 例如:相对路径:image/l ...
- JS(JavaScript)的进一步了解6(更新中···)
元素的属性 div.attributes 是所有标签属性构成的数据集合 div.classList 是所有class名构成的数组集合 在classList的原型链上看以看到add()和remove() ...
- Bigger-Mai 养成计划,Python基础巩固四
一.装饰器:定义:本质是函数,(装饰其他函数)就是为其他函数添加附加功能.原则:1.不能修改被装饰的函数的源代码 2.不能修改被装饰函数的调用方式实现装饰器的知识储备:1.函数即‘变量’2.高阶函数 ...
- Mybatis注解和配置文件命名规范所引发的问题
最近做SSM项目,在编写完login方法后,运行测试就发生错误. 报错如下: Error querying database. Cause: org.springframework.jdbc.Cann ...
- [转载]如何快速下载、安装和配置chromedriver ?
转自:https://jingyan.baidu.com/album/f7ff0bfcdd89ed2e27bb1379.html?picindex=7 下载地址: http://npm.taobao. ...