1043: [HAOI2008]下落的圆盘 - BZOJ
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的更多相关文章
- 【BZOJ】1043: [HAOI2008]下落的圆盘(计算几何基础+贪心)
http://www.lydsy.com/JudgeOnline/problem.php?id=1043 唯一让我不会的就是怎么求圆的周长并QAAQ... 然后发现好神!我们可以将圆弧变成$[0, 2 ...
- BZOJ 1043 HAOI2008 下落的圆盘 计算几何
题目大意:n个圆盘依次下落.求终于能看到的轮廓线面积 円盘反对! 让我们一起团结起来! 赶走円盘! 咳咳.非常神的一道题 今天去看了题解和白书才搞出来-- 首先我们倒着做 对于每一个圆盘处理出在它之后 ...
- bzoj 1043 [HAOI2008]下落的圆盘——圆的周长
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1043 算每个圆被它后面的圆盖住了多少圆弧即可.注意判断这个圆完全被后面盖住的情况. #inc ...
- BZOJ 1043 [HAOI2008]下落的圆盘 ——计算几何
倒着考虑,加入一个圆,判断和前面有没有完全覆盖的情况. 如果没有,和圆盘一一取交集,然后计算它们的并集,然后计算即可. #include <map> #include <cmath& ...
- 1043: [HAOI2008]下落的圆盘
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1725 Solved: 743[Submit][Status][Discuss] Descripti ...
- bzoj1043[HAOI2008]下落的圆盘 计算几何
1043: [HAOI2008]下落的圆盘 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1598 Solved: 676[Submit][Stat ...
- 【BZOJ1043】[HAOI2008]下落的圆盘 几何
[BZOJ1043][HAOI2008]下落的圆盘 Description 有n个圆盘从天而降,后面落下的可以盖住前面的.求最后形成的封闭区域的周长.看下面这副图, 所有的红色线条的总长度即为所求. ...
- luogu P2510 [HAOI2008]下落的圆盘
LINK:下落的圆盘 计算几何.n个圆在平面上编号大的圆将编号小的圆覆盖求最后所有没有被覆盖的圆的边缘的总长度. 在做这道题之前有几个前置知识. 极坐标系:在平面内 由极点 极轴 和 极径组成的坐标系 ...
- BZOJ 1043 【bzoj1043】[HAOI2008]下落的圆盘 | 暴力么??
题目: 题解: 大概是黄学长的博客 #include<cstdio> #include<algorithm> #include<cstring> #include& ...
随机推荐
- asp.net 文件压缩zip下载
今天分享下昨天做的一个东西 asp.net 的文件 zip 批量下载,首先你需要去 到http://dotnetzip.codeplex.com这个站点下载zip 的包,在里面找到 Ionic.Z ...
- 软件设计师考试计算机系统知识——CPU
第一章: 计算机系统知识 1.1.1计算机系统硬件的基本组成 运算器.控制器.存储器.输入设备.输出设备 1.1.2 中央处理器 ①CPU的功能: a.程序控制:CPU通过执行指令来控制程序执行的顺序 ...
- ECharts地图详解 【转】
$(function() { // 路径配置 require.config({ paths : { // echarts: 'http://echarts.baidu.com/build/dist' ...
- 把mvc4彻底搞定(一)
1 .net web开发方式 webform开发 asp.net mvc开发 2 请求模式 webform方式:客户端向服务端请求一个aspx页面,服务端生成一个页面对象类,调用这个页面对象类的PR方 ...
- Linux C编程--main函数参数解析
我们经常用的main函数都是不带参数的.因此main 后的括号都是空括号.实际上,main函数可以带参数,这个参数可以认为是 main函数的形式参数.C语言规定main函数的参数只能有两个, 习惯上这 ...
- opencv for android sample导入有误
我们下载好opencv for android 后导入eclipse的时候发现人脸检测还有一个sample项目会有小叉,但是好像没有文件有问题.这时我们该怎么办呢? 在window中: 我们右键选择p ...
- 基于Tengine的反向代理详细配置
系统环境: SUSE Linux Enterprise Server 10 SP1 (x86_64) 注:所有软件包都放置在/data/software目录下 nginx_tcp_proxy_modu ...
- android 获取前台进程
String getTopActivity() { ActivityManager manager = (ActivityManager)getSystemService(ACTIVITY_SERVI ...
- Objective-c中的对象间的消息传递以及消息路由
刚开始使用Objective-C时,总是习惯将对象间发送消息之间称呼为方法调用.心想,这和c#不是一回事吗?不就是调用实例方法吗,还搞个消息发送作甚,最后还不是要转化为方法的调用?通过一段时间的理解学 ...
- iOS 非ARC基本内存管理系列 3-循环retain和@class
1.@class 使用场景:对于循环依赖关系来说,比方A类引用B类,同时B类也引用A类: 可以看出Person和Card互相引用,此时如果使用#import编译报错!因此当使用@class在两个类中相 ...