bzoj 1043 下落的圆盘 —— 求圆心角、圆周长
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1043
求出每个圆没被覆盖的长度即可;
特判包含和相离的情况,注意判包含时 i 包含 j 和 j 包含 i 是不同的情况;
然后考虑相交,可以算出被覆盖的那段圆弧所对的圆心角,用一个 [0,2π] 的角度区间维护没被覆盖的部分;
所求的角度是对于一条“基准线”而言的,所以首先要求出圆心连线对于“基准线”的角度,因为知道两个圆心,可以利用 atan2(y,x) 求出 tan(θ) = y/x 对应的 θ
然后求圆弧的两个端点的角度,发现已知三边,可以用余弦定理;
求出角度,覆盖区间,最后在 [0,2π] 上找出没被覆盖的区间长度,就能算了。
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
typedef double db;
db const Pi=acos(-1.0),eps=1e-;
int const xn=;
int n;
db ans;
struct N{db x,y,r;}p[xn];
struct P{
db l,r;
P(db l=,db r=):l(l),r(r) {}
bool operator < (const P &y) const
{return l<y.l;}
}v[xn];
db sqr(db x){return x*x;}
int dmp(db x){if(fabs(x)<=eps)return ; return x>eps?:-;}
db dis(N a,N b){return sqrt(sqr(a.x-b.x)+sqr(a.y-b.y));}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%lf%lf%lf",&p[i].r,&p[i].x,&p[i].y);
for(int i=;i<=n;i++)
{
bool fl=; int cnt=;
for(int j=i+;j<=n;j++)
{
db x1=p[i].x,x2=p[j].x,y1=p[i].y,y2=p[j].y,r1=p[i].r,r2=p[j].r,d=dis(p[i],p[j]);
if(dmp(d+p[i].r-p[j].r)<=){fl=; break;}//i in j
if(dmp(d+p[j].r-p[i].r)<=||dmp(d-p[i].r-p[j].r)>=)continue;//j in i
db fx=atan2(y2-y1,x2-x1);
db th=acos((sqr(r1)+sqr(d)-sqr(r2))/(*r1*d));//acos
db l=fx-th,r=fx+th;
while(l<)l+=*Pi; while(r<)r+=*Pi;
while(l>*Pi)l-=*Pi; while(r>*Pi)r-=*Pi;
if(dmp(l-r)<=)v[++cnt]=P(l,r);
else v[++cnt]=P(,r),v[++cnt]=P(l,*Pi);
}
if(fl)continue;//
sort(v+,v+cnt+);
db mx=,g=;
for(int j=;j<=cnt;j++)
{
if(dmp(v[j].r-mx)<=)continue;
if(dmp(v[j].l-mx)>)g+=v[j].l-mx;
mx=v[j].r;
}
ans+=p[i].r*(g+*Pi-mx);//
}
printf("%.3f\n",ans);
return ;
}
bzoj 1043 下落的圆盘 —— 求圆心角、圆周长的更多相关文章
- [bzoj] 1043 下落的圆盘 || 圆上的“线段覆盖”
原题 n个圆盘,求下落后能看到的总周长. 红色即为所求 借鉴于黄学长的博客 对于每下落的一个圆盘,处理他后面的圆盘会挡住哪些区域,然后把一整个圆(2\(/pi\))当做一整个区间,每个被覆盖的部分都可 ...
- BZOJ 1043 下落的圆盘
Description 有n个圆盘从天而降,后面落下的可以盖住前面的.求最后形成的封闭区域的周长.看下面这副图, 所有的红色线条的总长度即为所求. Input n ri xi y1 ... rn x ...
- bzoj1043[HAOI2008]下落的圆盘 计算几何
1043: [HAOI2008]下落的圆盘 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1598 Solved: 676[Submit][Stat ...
- Bzoj1313 [HAOI2008]下落的圆盘
有 n 个圆盘从天而降,后面落下的可以盖住前面的.最后按掉下的顺序,在平面上依次测得每个圆盘的圆心和半径,问下落完成后从上往下看,整个图形的周长是多少,即你可以看到的圆盘的轮廓的圆盘的轮廓总长.例如下 ...
- 【bzoj1043】下落的圆盘
[bzoj1043]下落的圆盘 题意 有n个圆盘从天而降,后面落下的可以盖住前面的.求最后形成的封闭区域的周长.看下面这副图, 所有的红色线条的总长度即为所求. \(1\leq n\leq 1000\ ...
- 【BZOJ1043】下落的圆盘 [计算几何]
下落的圆盘 Time Limit: 10 Sec Memory Limit: 162 MB[Submit][Status][Discuss] Description 有n个圆盘从天而降,后面落下的可 ...
- 【BZOJ1043】[HAOI2008]下落的圆盘 几何
[BZOJ1043][HAOI2008]下落的圆盘 Description 有n个圆盘从天而降,后面落下的可以盖住前面的.求最后形成的封闭区域的周长.看下面这副图, 所有的红色线条的总长度即为所求. ...
- luogu P2510 [HAOI2008]下落的圆盘
LINK:下落的圆盘 计算几何.n个圆在平面上编号大的圆将编号小的圆覆盖求最后所有没有被覆盖的圆的边缘的总长度. 在做这道题之前有几个前置知识. 极坐标系:在平面内 由极点 极轴 和 极径组成的坐标系 ...
- 【计算几何】bzoj1043 [HAOI2008]下落的圆盘
n^2枚举圆盘,用两圆圆心的向量的极角+余弦定理求某个圆覆盖了该圆的哪一段区间(用弧度表示),最后求个区间并. 注意--精度--最好再累计区间的时候,把每个区间的长度减去EPS,防止最后覆盖的总区间超 ...
随机推荐
- 反素数ant(数学题)
1053: [HAOI2007]反素数ant Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2872 Solved: 1639[Submit][St ...
- 【题解】Cutting Game
[题解]Cutting Game vjudge 谈谈对\(sg\)函数的理解? 浅谈公平组合游戏IGC //@winlere #include<cstring> #include<c ...
- Java语言实现简单FTP软件------>源码放送(十三)
Java语言实现简单FTP软件------>FTP协议分析(一) Java语言实现简单FTP软件------>FTP软件效果图预览之下载功能(二) Java语言实现简单FTP软件----- ...
- 检出的maven项目没有“M”标识
从SVN服务器上检出的项目,在项目左上角没有“M”标识 解决此方案有两种方法: 1.将检出的项目“删除”(不删除工作空间的项目),重新导入,选择“Maven 项目”,导入完成即可. 2.选中项目右键, ...
- 记一次bash脚本报错原因
准备部署上次写的 爬虫的定时任务,发现sh脚本 写为最简单的cd ,也报错 后来网上一波了解,原因竟是 : 额,格式问题,我为了图方便是在window里用notepad++写的,然后我再linux 系 ...
- 小程序getApp() 被删除坑
在一个非page的js文件内使用getApp,当前台切到后台的时候,定义的var app = getApp()被删除了 如:新建一个app-libs.js start: function() { va ...
- js完美实现table分页
// JavaScript Document /** * js分页类 * @param iAbsolute 每页显示记录数 * @param sTableId 分页表格属性ID值,为String * ...
- [原创]java WEB学习笔记25:MVC案例完整实践(part 6)---新增操作的设计与实现
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- Ubuntu14 下安装jdk1.8
1.oracle官网下载jdk-8u45-linux-i586.gz 此为32位 2.放在任意目录下,如/home/hongxf 3.直接解压该文件 sudo tar -xvf jdk-8u45-li ...
- github与eclipse结合使用
github是现在流行的代码托管平台,今天以eclipse为例讲解github的使用,新建项目,提交eclipse项目到github,新建分支,合并分支 1.github上新建项目 记下githug项 ...