Description

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

n ri xi y1 ... rn xn yn
Output

最后的周长,保留三位小数
Sample Input
2
1 0 0
1 1 0
Sample Output
10.472

数据规模
n<=1000

调了一晚上外加下午(弱菜写计算几何,tan函数都抄错了)

对每一个圆计算覆盖区间,然后排序,再区间合并,注意范围,我是全部弄到0到2π里

再膜拜一下z55250825,最后还是他看出错误来的

 uses math;
const
maxn=;
eps=1e-7;
var
r,x,y,ll,rr:array[..maxn*]of double;
n,tot:longint;
ans:double; procedure init;
var
i:longint;
begin
read(n);
for i:= to n do
read(r[i],x[i],y[i]);
end; function angle(a,b,c:double):double;
begin
exit(arccos((a*a+b*b-c*c)/(*a*b)));
end; function tan(x,y:double):double;
var
a:double;
begin
if abs(x)<eps then
begin
if y>-eps then exit(pi/)
else exit(pi*/);
end;
if abs(y)<eps then
begin
if x>-eps then exit()
else exit(pi);
end;
a:=arctan(y/x);
if a<-eps then a:=-a;
if x>-eps then
if y>-eps then exit(a)
else exit(*pi-a)
else
if y>-eps then exit(pi-a)
else exit(pi+a);
end; procedure swap(var x,y:double);
var
t:double;
begin
t:=x;x:=y;y:=t;
end; procedure sort(l,r:longint);
var
i,j:longint;
y:double;
begin
i:=l;
j:=r;
y:=ll[(l+r)>>];
repeat
while ll[i]+eps<y do
inc(i);
while ll[j]>y+eps do
dec(j);
if i<=j then
begin
swap(ll[i],ll[j]);
swap(rr[i],rr[j]);
inc(i);
dec(j);
end;
until i>j;
if i<r then sort(i,r);
if l<j then sort(l,j);
end; procedure work;
var
i,j:longint;
d,a,b,sum,xx,yy:double;
cover:boolean;
begin
for i:= to n do
begin
tot:=;
cover:=false;
for j:=i+ to n do
begin
d:=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
if (r[i]+r[j]-d<eps)or(d+r[j]-r[i]<eps) then continue;
if d+r[i]-r[j]<eps then
begin
cover:=true;
break;
end;
a:=tan(x[j]-x[i],y[j]-y[i]);
b:=angle(d,r[i],r[j]);
inc(tot);
ll[tot]:=a-b;
rr[tot]:=a+b;
if ll[tot]<-eps then
begin
ll[tot+]:=*pi+ll[tot];
rr[tot+]:=*pi;
ll[tot]:=;
inc(tot);
end;
if rr[tot]>*pi+eps then
begin
rr[tot+]:=rr[tot]-*pi;
ll[tot+]:=;
rr[tot]:=*pi;
inc(tot);
end;
end;
if cover then continue;
sort(,tot);
inc(tot);
ll[tot]:=;
rr[tot]:=;
sum:=;
xx:=;
yy:=;
for j:= to tot do
if ll[j]+eps<=yy then
begin
if rr[j]+eps<=yy then continue;
yy:=rr[j];
end
else
begin
sum:=sum+yy-xx;
xx:=ll[j];
yy:=rr[j];
end;
ans:=ans+(*pi-sum)*r[i];
end;
write(ans::);
end; begin
init;
work;
end.

1043: [HAOI2008]下落的圆盘 - BZOJ的更多相关文章

  1. 【BZOJ】1043: [HAOI2008]下落的圆盘(计算几何基础+贪心)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1043 唯一让我不会的就是怎么求圆的周长并QAAQ... 然后发现好神!我们可以将圆弧变成$[0, 2 ...

  2. BZOJ 1043 HAOI2008 下落的圆盘 计算几何

    题目大意:n个圆盘依次下落.求终于能看到的轮廓线面积 円盘反对! 让我们一起团结起来! 赶走円盘! 咳咳.非常神的一道题 今天去看了题解和白书才搞出来-- 首先我们倒着做 对于每一个圆盘处理出在它之后 ...

  3. bzoj 1043 [HAOI2008]下落的圆盘——圆的周长

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1043 算每个圆被它后面的圆盖住了多少圆弧即可.注意判断这个圆完全被后面盖住的情况. #inc ...

  4. BZOJ 1043 [HAOI2008]下落的圆盘 ——计算几何

    倒着考虑,加入一个圆,判断和前面有没有完全覆盖的情况. 如果没有,和圆盘一一取交集,然后计算它们的并集,然后计算即可. #include <map> #include <cmath& ...

  5. 1043: [HAOI2008]下落的圆盘

    Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1725  Solved: 743[Submit][Status][Discuss] Descripti ...

  6. bzoj1043[HAOI2008]下落的圆盘 计算几何

    1043: [HAOI2008]下落的圆盘 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1598  Solved: 676[Submit][Stat ...

  7. 【BZOJ1043】[HAOI2008]下落的圆盘 几何

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

  8. luogu P2510 [HAOI2008]下落的圆盘

    LINK:下落的圆盘 计算几何.n个圆在平面上编号大的圆将编号小的圆覆盖求最后所有没有被覆盖的圆的边缘的总长度. 在做这道题之前有几个前置知识. 极坐标系:在平面内 由极点 极轴 和 极径组成的坐标系 ...

  9. BZOJ 1043 【bzoj1043】[HAOI2008]下落的圆盘 | 暴力么??

    题目: 题解: 大概是黄学长的博客 #include<cstdio> #include<algorithm> #include<cstring> #include& ...

随机推荐

  1. hide(1000)跟show(1000)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. spring分布式事务学习笔记

    最近项目中使用了分布式事务,本文及接下来两篇文章总结一下在项目中学到的知识. 分布式事务对性能有一定的影响,所以不是最佳的解决方案,能通过设计避免最好尽量避免. 分布式事务(Distributed t ...

  3. Annotation注解与butterknife

    注解分为三种,一般来讲我们使用的是运行时会加载及能够反射读取的注解类型, 其他编译器生效的类型和编译后放入类文件而运行期不能加载解析的对我们没啥用. 所以从普通理解上来看,注解要配合着反射用就好了. ...

  4. TSQL基础(二)

    over() 开窗函数 排名函数必须和over()一起使用,所以先了解over(). OVER 子句定义查询结果集内的窗口或用户指定的行集. 然后,开窗函数将计算窗口中每一行的值. 您可以将 OVER ...

  5. jQuery实现图片轮播

    之前有碰到过jQuery实现列表自动滚动,这次的图片轮播在原理上与之相同,只有一些细微的差别,就是需要在图片的右下角显示当前图片的序号,效果如下: 先看一看html代码,以及对应的css代码: < ...

  6. poj 3616 Milking Time

                                                                                                 Milking ...

  7. JQ跑马灯

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  8. winfrom LED时钟

    public sealed class Clock : PictureBox { public Clock() { SetStyle(ControlStyles.AllPaintingInWmPain ...

  9. CSS制作图片水平垂直居中 亲测推荐

    空白标签实现图片的垂直居中 这种方法很有意思,也很有独特之处,我的思路也是来自于张鑫旭-鑫空间-鑫生活写的<大小不固定的图片.多行文字的水平垂直居中>一文中的使用空白图片实现垂直对齐.他主 ...

  10. php中封装的curl函数(抓取数据)

    介绍一个封闭好的函数,封闭了curl函数的常用步骤,方便抓取数据. 代码如下: <?php /** * 封闭好的 curl函数 * 用途:抓取数据 * edit by www.jbxue.com ...