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. Socket编程初探

    一.什么是Socket? 通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.在Internet上的主机一般运行了多个服务软件,同时提供几种服务.每种服务都打开一个S ...

  2. EF 实体+ Newtonsoft.Json 输出JSON 时动态忽略属性的解决方法

    最近的项目采用的是 ASP.NET mvc 4.0 + entity framework 5.0 ,后台以JSON形式抛出数据是借助于Newtonsoft.Json ,   要想忽略的属性前面添加特性 ...

  3. img与父元素的间隙解决

    近来在做H5页面时,突然发现一个问题,使用一个div包裹一个img,在手机预览时,发现图片与div之间有间隙. 当时第一反应就是,是不是间距没有设置为0,于是预览了下代码: .active img { ...

  4. 从零单排Linux – 2 – 目录权限

    从零单排Linux – 2 – 目录权限 1.sync 讲内存数据跟新到硬盘中 2.执行等级init a: run level 0:关机 b: run level 3:纯命令模式 c:run leve ...

  5. 【Knockout】四、绑定上下文

    Binding context binding context是一个保存数据的对象,你可以在你的绑定中引用它.当应用绑定的时候,knockout自动创建和管理binding context的继承关系. ...

  6. ASP.NET播客(留言时间,投票IP,留言限字数,上传视频)

    留言发布时间功能: 界面: 前台代码: 在Datalist控件中: 在<%#getIsDate(Convert.ToString(Eval("issuanceDate"))) ...

  7. jQuery之渐变切换

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. JSP之初识

    JSP是“java server pages”的缩写,java是一种编程语言,jsp只是相当于java里面的servlet部分,所以JSP技术是以Java语言作为脚本语言的. JSP这门技术的最大的特 ...

  9. 安装和启动mongodb数据库

    参考链接:http://www.fkblog.org/blog569 参考链接:http://www.cnblogs.com/linjiqin/p/3192159.html

  10. JQuery中操作表单和表格

    一:表单应用 1.HTML中的表单大致由三部分组成 (1).表单便签:包含处理表单数据所用的服务端程序URL,以及数据提交到服务器的方法. (2).表单域:包含文本框.密码框.隐藏域.多行文本框.复选 ...