bzoj1043 [HAOI2008]下落的圆盘
Description
有n个圆盘从天而降,后面落下的可以盖住前面的。求最后形成的封闭区域的周长。看下面这副图, 所有的红色线条的总长度即为所求.

Input
第一行为1个整数n,N<=1000
接下来n行每行3个实数,ri,xi,yi,表示下落时第i个圆盘的半径和圆心坐标.
Output
最后的周长,保留三位小数
Sample Input
1 0 0
1 1 0
Sample Output
正解:计算几何。
枚举每一个圆,看它有多少没有被覆盖。
具体来说,就是再枚举与它相交且在它上面的圆,算出这个圆的覆盖区间,然后求出所有区间的总覆盖长度即可。
对于一个圆,可以求出圆心距的那条线的极角,然后用余弦定理求出这条直线与交点和圆心的直线的夹角,即可得夹角区间。
#include <bits/stdc++.h>
#define il inline
#define RG register
#define ll long long
#define N (2005) using namespace std; const double pi=acos(-1.0); struct point{ double r,x,y; }p[N];
struct data{ double l,r; }st[N]; double ans;
int n,top; il int cmp(const data &a,const data &b){ return a.l<b.l; } il double dis(RG int i,RG int j){
return sqrt((p[i].x-p[j].x)*(p[i].x-p[j].x)+(p[i].y-p[j].y)*(p[i].y-p[j].y));
} il int contain(RG int i,RG int j){ return p[j].r-p[i].r>=dis(i,j); } il double calc(RG int id){
for (RG int i=id+;i<=n;++i) if (contain(id,i)) return ;
for (RG int i=id+;i<=n;++i){
RG double d=dis(i,id); if (contain(i,id) || p[i].r+p[id].r<=d) continue;
RG double t=acos((d*d+p[id].r*p[id].r-p[i].r*p[i].r)/(*d*p[id].r));
RG double base=atan2(p[i].y-p[id].y,p[i].x-p[id].x);
st[++top]=(data){base-t,base+t};
if (st[top].l<) st[top].l+=*pi; if (st[top].r<) st[top].r+=*pi;
if (st[top].l>st[top].r) st[top+]=(data){,st[top].r},st[top++].r=*pi;
}
sort(st+,st+top+,cmp); RG double now=,res=;
for (RG int i=;i<=top;++i){
if (now<st[i].l) res+=st[i].l-now,now=st[i].r;
else now=max(now,st[i].r);
}
res+=*pi-now,top=; return res*p[id].r;
} int main(){
#ifndef ONLINE_JUDGE
freopen("circle.in","r",stdin);
freopen("circle.out","w",stdout);
#endif
cin>>n;
for (RG int i=;i<=n;++i) scanf("%lf%lf%lf",&p[i].r,&p[i].x,&p[i].y);
for (RG int i=;i<=n;++i) ans+=calc(i); printf("%0.3lf\n",ans); return ;
}
bzoj1043 [HAOI2008]下落的圆盘的更多相关文章
- bzoj1043[HAOI2008]下落的圆盘 计算几何
1043: [HAOI2008]下落的圆盘 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1598 Solved: 676[Submit][Stat ...
- 【计算几何】bzoj1043 [HAOI2008]下落的圆盘
n^2枚举圆盘,用两圆圆心的向量的极角+余弦定理求某个圆覆盖了该圆的哪一段区间(用弧度表示),最后求个区间并. 注意--精度--最好再累计区间的时候,把每个区间的长度减去EPS,防止最后覆盖的总区间超 ...
- BZOJ-1043 [HAOI2008]下落的圆盘
几何题... 先把所有圆储存起来,然后对于每个圆我们求得之后放下的圆挡住了的部分,求个并集,并把没被挡到的周长加进答案. #include <cstdlib> #include <c ...
- 【BZOJ1043】[HAOI2008]下落的圆盘 几何
[BZOJ1043][HAOI2008]下落的圆盘 Description 有n个圆盘从天而降,后面落下的可以盖住前面的.求最后形成的封闭区域的周长.看下面这副图, 所有的红色线条的总长度即为所求. ...
- 【bzoj1043】下落的圆盘
[bzoj1043]下落的圆盘 题意 有n个圆盘从天而降,后面落下的可以盖住前面的.求最后形成的封闭区域的周长.看下面这副图, 所有的红色线条的总长度即为所求. \(1\leq n\leq 1000\ ...
- 【BZOJ1043】下落的圆盘 [计算几何]
下落的圆盘 Time Limit: 10 Sec Memory Limit: 162 MB[Submit][Status][Discuss] Description 有n个圆盘从天而降,后面落下的可 ...
- luogu P2510 [HAOI2008]下落的圆盘
LINK:下落的圆盘 计算几何.n个圆在平面上编号大的圆将编号小的圆覆盖求最后所有没有被覆盖的圆的边缘的总长度. 在做这道题之前有几个前置知识. 极坐标系:在平面内 由极点 极轴 和 极径组成的坐标系 ...
- BZOJ1043:[HAOI2008]下落的圆盘——题解(配图片)
http://www.lydsy.com/JudgeOnline/problem.php?id=1043 Description 有n个圆盘从天而降,后面落下的可以盖住前面的.求最后形成的封闭区域的周 ...
- 【bzoj1043】[HAOI2008]下落的圆盘 计算几何
题目描述 有n个圆盘从天而降,后面落下的可以盖住前面的.求最后形成的封闭区域的周长.看下面这副图, 所有的红色线条的总长度即为所求. 输入 第一行为1个整数n,N<=1000接下来n行每行3个实 ...
随机推荐
- 6.Spring MVC SSM整合问题总结
1.Cannot find class [org.springframework.http.converter.json.MappingJacksonHttpMessageConverter] for ...
- hdfs基本操作-python接口
安装hdfs包 pip install hdfs 查看hdfs目录 [root@hadoop hadoop]# hdfs dfs -ls -R / drwxr-xr-x - root supergro ...
- es知识点
版权声明:本文为博主原创文章,未经博主允许不得转载.转载请务必加上原作者:铭毅天下,原文地址:blog.csdn.net/laoyang360 https://blog.csdn.net/wojius ...
- MySQL慢日志简介及Anemometer工具介绍
作者:王航威 - fordba.com 来源:http://fordba.com/box-anemometer-visual-mysql-slow.html,叶师傅对原文内容略有调整 备注:王航威是知 ...
- Falsk的模板分配和蓝图、定制错误信息、 和补充
Flask的模板渲染: Flask的模板在进行渲染的时候是默认选则templates下的html文件 我们可以在实例化app的时候,指定文件来进行选择: 模板渲染更改文件夹:template_fold ...
- Unity调用安卓中的方法遇到的问题
最近在用U3D做一个简单的迷宫游戏,在项目中利用Unity制作游戏场景,在android中调用游戏场景,并在游戏结束后调用安卓方法,传递参数,退出游戏场景 查找网上资料,基本上Unity调用安卓的写法 ...
- Asp.net Core相关教程及开源项目推荐
入门 全新的ASP.NET: https://www.cnblogs.com/Leo_wl/p/5654828.html 在IIS上部署你的ASP.NET Core项目: https://www.c ...
- December 03rd 2016 Week 49th Saturday
By failing to prepare, you are preparing to fail. 不做准备,那就准备失败吧. How does the case when you had prepa ...
- Git操作(基础篇)
Git操作(基础篇) Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目.Git的读音为/gɪt/.Git是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常 ...
- JavaScript创建对象的6种方式
JavaScript创建对象简单的说,无非就是使用内置对象(Object)或各种自定义对象,当然还可以用JSON,但写法有很多种,也能混合使用. 1.对象字面量的方式 person = {name : ...