[bzoj] 1043 下落的圆盘 || 圆上的“线段覆盖”
原题
n个圆盘,求下落后能看到的总周长。

红色即为所求
借鉴于黄学长的博客
对于每下落的一个圆盘,处理他后面的圆盘会挡住哪些区域,然后把一整个圆(2\(/pi\))当做一整个区间,每个被覆盖的部分都可以化为一条线段,做线段覆盖就可以得到最后这个圆对答案的贡献了。

详解见代码。
#include<cstdio>
#include<algorithm>
#include<cmath>
#define pi acos(-1)
#define N 1010
typedef long long ll;
using namespace std;
int n,top;
double ans,x[N],y[N],r[N];
struct line
{
double l,r;
line() {}
line(double x,double y) : l(x),r(y) {}
line(int x,double y) : l(x),r(y) {}//鬼畜的构造函数……
bool operator < (const line b) const
{
return l<b.l;
}
}q[N];
inline double dis(int a,int b)
{
return sqrt((x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b]));
}
bool conta(int a,int b)//判断b圆有没有被a圆完全覆盖
{
if (r[a]>=r[b]+dis(a,b)) return 1;
return 0;
}
void inter(int a,int b)
{
double d,t,st,l;
d=dis(a,b);
t=(r[a]*r[a]-r[b]*r[b]+d*d)/(2*d*r[a]);//余弦定理求角(位置见上图)
st=atan2((x[a]-x[b]),(y[a]-y[b]));
l=acos(t);
q[++top]=line(st-l,st+l);//以弧的两个端点当做线段的两个端点
}
double cal(int x)//求第x个圆最后能看到的周长
{
for (int i=x+1;i<=n;i++)
if (conta(i,x)) return 0;//如果被其他圆覆盖,就没有贡献
top=0;
for (int i=x+1;i<=n;i++)
if (!conta(x,i) && r[x]+r[i]>=dis(x,i))//这两个圆相交
inter(x,i);//求出被覆盖的部分并简化为线段
double tmp=0,now=0;
for (int i=1;i<=top;i++)//把角度都处理到[0,$2/pi$)中
{
if (q[i].l<0) q[i].l+=2*pi;
if (q[i].r<0) q[i].r+=2*pi;
if (q[i].l>q[i].r)
{
q[++top]=line(0,q[i].r);
q[i].r=2*pi;
}
}
sort(q+1,q+top+1);
for (int i=1;i<=top;i++)//线段覆盖
if (q[i].l>now)
{
tmp+=q[i].l-now;
now=q[i].r;
}
else now=max(now,q[i].r);
tmp+=2*pi-now;
return r[x]*tmp;//能看到的长度
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%lf%lf%lf",&r[i],&x[i],&y[i]);
for (int i=1;i<=n;i++)
ans+=cal(i);
printf("%.3f",ans);
return 0;
}
[bzoj] 1043 下落的圆盘 || 圆上的“线段覆盖”的更多相关文章
- bzoj 1043 下落的圆盘 —— 求圆心角、圆周长
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1043 求出每个圆没被覆盖的长度即可: 特判包含和相离的情况,注意判包含时 i 包含 j 和 ...
- BZOJ 1043 下落的圆盘
Description 有n个圆盘从天而降,后面落下的可以盖住前面的.求最后形成的封闭区域的周长.看下面这副图, 所有的红色线条的总长度即为所求. Input n ri xi y1 ... rn x ...
- bzoj 1043 [HAOI2008]下落的圆盘——圆的周长
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1043 算每个圆被它后面的圆盖住了多少圆弧即可.注意判断这个圆完全被后面盖住的情况. #inc ...
- bzoj1043[HAOI2008]下落的圆盘 计算几何
1043: [HAOI2008]下落的圆盘 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1598 Solved: 676[Submit][Stat ...
- BZOJ 1041: [HAOI2008]圆上的整点
1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3621 Solved: 1605[Submit][Sta ...
- bzoj 1041: [HAOI2008]圆上的整点 数学
1041: [HAOI2008]圆上的整点 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/ ...
- bzoj 1041: [HAOI2008]圆上的整点 本原勾股數組
1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2027 Solved: 853[Submit][Stat ...
- BZOJ 1041 [HAOI2008]圆上的整点:数学
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1041 题意: 给定n(n <= 2*10^9),问你在圆x^2 + y^2 = n^ ...
- BZOJ 1041: [HAOI2008]圆上的整点【数论,解方程】
1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4210 Solved: 1908[Submit][Sta ...
随机推荐
- ES6 extends继承及super使用读书笔记
extends 继承 extends 实现子类的继承 super() 表示父类的构造函数, 子类必须在 constructor中调用父类的方法,负责会报错. 子类的 this 是父类构造出来的, 再在 ...
- jquery 筛选元素 (3)
.addBack() 添加堆栈中元素集合到当前集合中,一个选择性的过滤选择器. .addBack([selector]) selector 一个字符串,其中包括一个选择器表达式,匹配当前元素集合,不包 ...
- 洛谷P1829 [国家集训队]Crash的数字表格 / JZPTAB(莫比乌斯反演)
题目背景 提示:原 P1829 半数集问题 已经迁移至 P1028 数的计算 题目描述 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a ...
- 记 判断手机号运营商function
/* 移动:134.135.136.137.138.139.150.151.157(TD).158.159.187.188 联通:130.131.132.152.155.156.185.186 电信: ...
- linux 下chown改变隐藏文件夹
chown 在更改隐藏文件的时候,发现无法更改其用户组,如果需要将隐藏文件夹也做一个更改,那么需要加上-h选项. sudo chown ai/node/ * -hR 使用以上命令即可.
- 005--Django2.0的路由层
URL配置就像Django所支撑的网站目录,它的本质是每条URL调用的视图函数的映射表,每一个请求执行对应的视图函数. 1.简单的路由配置 from django.contrib import ad ...
- zookeeper: web ui工具的安装
zookeeper官方没有提供web用户界面,这使很多人在使用zookeeper(动物管理员)同时,并不是很容易的理解zookeeper的数据结构,还好淘宝有位大神用Nodejs写了一个web的ui工 ...
- Maven系列之快速入门
文章结构 唯快不破---Maven快速入门 稳打稳扎---Maven核心知识 实用为先---Maven如何建立Web项目 1 唯快不破---Maven快速入门 1.1 Maven项目 ...
- Enhacing the content with JavaScript
What not to do : In theory , you could use JavaScript to add important content to a web page. Howev ...
- java练习——接口与继承
父类与子类的构造方法: 如果父类中有一个默认无参的构造方法,那么子类的构造方法中会自动进行调用.如果父类有自己的构造方法,且这时父类没有默认无参的构造方法,那么在子类的构造方法中,必须要调用父类的某个 ...