【BZOJ1043】[HAOI2008]下落的圆盘 几何
【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
题解:对于每个圆,我们枚举它后面的所有圆,先判断后面的圆是否完全覆盖了当前圆,再考虑相交的情况。我们求出后面的圆覆盖了当前圆的哪部分,然后我们将圆的周长拉直,那么每个被覆盖的部分都可以看成一个线段,求一下这些线段的并即可。
求圆交方法:直接用余弦定理求出覆盖角度的大小,然后用极角求出角的位置即可。如果角的大小>=2pi或<0,则需要特殊处理。
求线段并方法:我的方法可能有点naive,方法是将线段左端看成+1,右端看成-1,那么排个序求前缀和,前缀和>0的部分就是被覆盖的部分。
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#define pi acos(-1.0)
using namespace std;
struct circle
{
double x,y,r;
circle(){}
circle(double a,double b) {x=a,y=b;}
circle operator + (circle a) {return circle(x+a.x,y+a.y);}
circle operator - (circle a) {return circle(x-a.x,y-a.y);}
circle operator * (double a) {return circle(x*a,y*a);}
circle operator / (double a) {return circle(x/a,y/a);}
}c[1010];
struct node
{
double x;
int v;
}p[2010];
double ans;
double dist(circle a,circle b) {return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}
int n,tot,sum,flag;
bool cmp(node a,node b)
{
return a.x<b.x;
}
int main()
{
scanf("%d",&n);
int i,j;
for(i=1;i<=n;i++) scanf("%lf%lf%lf",&c[i].r,&c[i].x,&c[i].y);
for(i=1;i<=n;i++)
{
tot=sum=flag=0;
for(j=i+1;j<=n;j++)
{
double dis=dist(c[i],c[j]);
if(dis<=c[j].r-c[i].r)
{
flag=1;
break;
}
if(dis>fabs(c[i].r-c[j].r)&&dis<=c[i].r+c[j].r)
{
double a=acos((c[i].r*c[i].r+dis*dis-c[j].r*c[j].r)/(2*c[i].r*dis));
double b=atan2(c[j].y-c[i].y,c[j].x-c[i].x);
p[++tot].x=b-a,p[tot].v=1,p[++tot].x=b+a,p[tot].v=-1;
if(p[tot-1].x<0) p[tot-1].x+=2*pi;
if(p[tot].x<0) p[tot].x+=2*pi;
if(p[tot-1].x>=2*pi) p[tot-1].x-=2*pi;
if(p[tot].x>=2*pi) p[tot].x-=2*pi;
if(p[tot-1].x>p[tot].x) sum++;
}
}
if(flag) continue;
ans+=c[i].r*2*pi;
if(!tot) continue;
sort(p+1,p+tot+1,cmp);
for(j=1;j<=tot;j++)
{
if(sum) ans-=c[i].r*(p[j].x-p[j-1].x);
sum+=p[j].v;
}
if(sum) ans-=c[i].r*(2*pi-p[tot].x);
}
printf("%.3lf",ans);
return 0;
}
【BZOJ1043】[HAOI2008]下落的圆盘 几何的更多相关文章
- bzoj1043[HAOI2008]下落的圆盘 计算几何
1043: [HAOI2008]下落的圆盘 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1598 Solved: 676[Submit][Stat ...
- 【计算几何】bzoj1043 [HAOI2008]下落的圆盘
n^2枚举圆盘,用两圆圆心的向量的极角+余弦定理求某个圆覆盖了该圆的哪一段区间(用弧度表示),最后求个区间并. 注意--精度--最好再累计区间的时候,把每个区间的长度减去EPS,防止最后覆盖的总区间超 ...
- bzoj1043 [HAOI2008]下落的圆盘
Description 有n个圆盘从天而降,后面落下的可以盖住前面的.求最后形成的封闭区域的周长.看下面这副图, 所有的红色线条的总长度即为所求. Input 第一行为1个整数n,N<=1000 ...
- BZOJ-1043 [HAOI2008]下落的圆盘
几何题... 先把所有圆储存起来,然后对于每个圆我们求得之后放下的圆挡住了的部分,求个并集,并把没被挡到的周长加进答案. #include <cstdlib> #include <c ...
- 【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个实 ...
随机推荐
- “百度杯”CTF比赛 十月场_Login
题目在i春秋ctf大本营 打开页面是两个登录框,首先判断是不是注入 尝试了各种语句后,发现登录界面似乎并不存在注入 查看网页源代码,给出了一个账号 用帐密登陆后,跳转到到member.php网页,网页 ...
- Metasploit笔记之信息收集命令
书籍参考:Metasploit渗透指南 Nmap:使用没有时 ubuntu自动提示安装命令 用法: nmap -sS -Pn 192.168.1.0 -sS:执行一次隐秘的tcp扫描 -Pn:不使用 ...
- AForge.NET 设置摄像头分辨率
AForge.NET 老版本在预览摄像头时可通过设置DesiredFrameSize 属性,设置摄像头支持的分辨率,新版本提示已过期: 解决办法: 获取VideoCapabilities属性集合,选中 ...
- Charger Warning Message
使用 PMIC_RGS_VCDT_HV_DET 判斷 charger 是否有 ovp. LV_VTH : 4.15V
- Python和其他进程的管道通信方式--popen和popen2的比较
目前有一个查询程序 get_user_id 是用C写的,python需要调用这个程序:使用 get_user_id "用户名" 可以得到输出: "ID0002451&q ...
- yii框架缓存知识总结(转载)
缓存是用于提升网站性能的一种即简单又有效的途径.稍微有点规模的网站都会通过存储相对静态的数据至缓存以备所需,这样我们可以省去从数据库查询然后生成这些数据的时间,通过减轻数据库的压力从而提升网站的性能. ...
- TopCoder SRM596 DIV2 1000: SparseFactorialDiv2
题意: For an integer n, let F(n) = (n - 0^2) * (n - 1^2) * (n - 2^2) * (n - 3^2) * ... * (n - k^2), wh ...
- 洛谷—— P1875 佳佳的魔法药水
https://www.luogu.org/problemnew/show/1875 题目背景 发完了 k 张照片,佳佳却得到了一个坏消息:他的 MM 得病了!佳佳和大家一样焦急 万分!治好 MM 的 ...
- C# SQL帮助类
C# SQL帮助类 本人自己封装的SQLHelper类,执行sql server与Oracle数据的增删改查 vs自带的Oracle数据库引用需要安装Oracle客户端,如不想安装Oracle客户端, ...
- Java中泛型的Class<Object>与Class<?>的区别(转)
Object是一个具体的类名,而?是一个占位符号,表示任何类型,只要是SomeClass类或者子类就可以. List<Object>可以放任何类对象. List<? extends ...