bzoj1043
每次做计算几何题都要做好久
考虑每个圆对答案的贡献,也就是每个圆被后面圆覆盖还有多少
可以把覆盖当成盖住一段弧度,看最后有多少没被覆盖
这就相当于线段覆盖问题了,
推推公式,算极角然后排序即可
md,pascal算极角就是麻烦
uses math;
const pi=3.1415926535897932384626433832795;
eps=1e-4;
type node=record
l,r:double;
end; var q:array[..] of node;
x,y,r:array[..] of double;
t,j,i,n:longint;
ans:double; function dis(i,j:longint):double;
begin
exit(sqrt(sqr(x[i]-x[j])+sqr(y[i]-y[j])));
end; function have(i,j:longint):boolean;
begin
exit(r[j]-r[i]>=dis(i,j));
end; procedure swap(var a,b:node);
var c:node;
begin
c:=a;
a:=b;
b:=c;
end; function get(x,y:double):double;
begin
if x= then
begin
if y> then exit(pi/)
else exit(-pi/);
end;
get:=arctan(y/x);
if (x<) then get:=get+pi;
end; procedure sort(l,r:longint);
var i,j:longint;
x:double;
begin
i:=l;
j:=r;
x:=q[(l+r) shr ].l;
repeat
while q[i].l<x do inc(i);
while x<q[j].l do dec(j);
if not(i>j) then
begin
swap(q[i],q[j]);
inc(i);
dec(j);
end;
until i>j;
if l<j then sort(l,j);
if i<r then sort(i,r);
end; function cal(j:longint):double;
var i:longint;
d,now,l,z,an:double;
begin
for i:=j+ to n do
if have(j,i) then exit();
t:=;
for i:=j+ to n do
begin
d:=dis(i,j);
if not have(i,j) and (r[j]+r[i]>d) then
begin
inc(t);
an:=get(x[i]-x[j],y[i]-y[j]);
l:=(sqr(r[j])-sqr(r[i])+sqr(d))/(*d);
z:=arccos(l/r[j]);
q[t].l:=an-z;
q[t].r:=an+z;
// writeln(an,' ',z,' ',i,' ',x[i]-x[j],' ',y[i]-y[j]);
// readln;
end;
end;
for i:= to t do
begin
if q[i].l>*pi then q[i].l:=q[i].l-*pi;
if q[i].r>*pi then q[i].r:=q[i].r-*pi;
if q[i].l< then q[i].l:=q[i].l+*pi;
if q[i].r< then q[i].r:=q[i].r+*pi;
if q[i].l>q[i].r then
begin
inc(t);
q[t].l:=;
q[t].r:=q[i].r;
q[i].r:=*pi;
end;
end;
sort(,t);
cal:=;
now:=;
for i:= to t do
if q[i].l>now then
begin
cal:=cal+(q[i].l-now);
now:=q[i].r;
end
else if now<q[i].r then now:=q[i].r; cal:=cal+*pi-now;
if cal< then cal:=;
cal:=cal*r[j];
end; begin
readln(n);
for i:= to n do
readln(r[i],x[i],y[i]); for i:= to n do
ans:=ans+cal(i); writeln(ans::);
end.
bzoj1043的更多相关文章
- 【计算几何】bzoj1043 [HAOI2008]下落的圆盘
n^2枚举圆盘,用两圆圆心的向量的极角+余弦定理求某个圆覆盖了该圆的哪一段区间(用弧度表示),最后求个区间并. 注意--精度--最好再累计区间的时候,把每个区间的长度减去EPS,防止最后覆盖的总区间超 ...
- 【bzoj1043】下落的圆盘
[bzoj1043]下落的圆盘 题意 有n个圆盘从天而降,后面落下的可以盖住前面的.求最后形成的封闭区域的周长.看下面这副图, 所有的红色线条的总长度即为所求. \(1\leq n\leq 1000\ ...
- 【BZOJ1043】[HAOI2008]下落的圆盘 几何
[BZOJ1043][HAOI2008]下落的圆盘 Description 有n个圆盘从天而降,后面落下的可以盖住前面的.求最后形成的封闭区域的周长.看下面这副图, 所有的红色线条的总长度即为所求. ...
- bzoj1043 下落的圆盘
Description 有n个圆盘从天而降,后面落下的可以盖住前面的.求最后形成的封闭区域的周长.看下面这副图, 所有的红色线条的总长度即为所求. Input 第一行为1个整数n,N<=100 ...
- bzoj1043[HAOI2008]下落的圆盘 计算几何
1043: [HAOI2008]下落的圆盘 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1598 Solved: 676[Submit][Stat ...
- bzoj1043 [HAOI2008]下落的圆盘
Description 有n个圆盘从天而降,后面落下的可以盖住前面的.求最后形成的封闭区域的周长.看下面这副图, 所有的红色线条的总长度即为所求. Input 第一行为1个整数n,N<=1000 ...
- BZOJ1043:[HAOI2008]下落的圆盘——题解(配图片)
http://www.lydsy.com/JudgeOnline/problem.php?id=1043 Description 有n个圆盘从天而降,后面落下的可以盖住前面的.求最后形成的封闭区域的周 ...
- 【BZOJ1043】下落的圆盘 [计算几何]
下落的圆盘 Time Limit: 10 Sec Memory Limit: 162 MB[Submit][Status][Discuss] Description 有n个圆盘从天而降,后面落下的可 ...
- BZOJ 1043 【bzoj1043】[HAOI2008]下落的圆盘 | 暴力么??
题目: 题解: 大概是黄学长的博客 #include<cstdio> #include<algorithm> #include<cstring> #include& ...
随机推荐
- android 开发不能创建目录
原来代码: File tempDir = new File(path); //path 是一个参数 if (!tempDir.exists()) { try { tempDir.mkdir(); // ...
- FFmpeg在Android上的移植之第一步
http://blog.sina.com.cn/s/blog_69a04cf40100x1fr.html 从事多媒体软件开发的人几乎没有不知道FFmpeg的,很多视频播放器都是基于FFmpeg开发的. ...
- Ffmpeg 定位文件(seek file)
有朋友问到ffmpeg播放文件如何定位问题,我想到应该还有一些新手朋友对这一块比较陌生.ffmpeg定位问题用到seek方法,代码 如下: void SeekFrame(AVFormatContext ...
- 2391: Cirno的忧郁 - BZOJ
Description Cirno闲着无事的时候喜欢冰冻青蛙.Cirno每次从雾之湖中固定的n个结点中选出一些点构成一个简单多边形,Cirno运用自己的能力能将此多边形内所有青蛙冰冻.雾之湖生活着m只 ...
- linux 下载并安装Memcache服务器端
1.下载并安装Memcache服务器端 服务器端主要是安装memcache服务器端. 下载:http://www.danga.com/memcached/dist/memcached-1.2.2.ta ...
- javaScript基础之闭包
不管是Jquery还是EXTJS,现代的js框架中大量应用了js的一些特性,比如:匿名函数,闭包等等,导致源代码非常难以阅读. 不过要想真正的使用好前台的UI技术,还是需要去深入的理解这些概念. ...
- 【POJ】【2348】Euclid‘s Game
博弈论 题解:http://blog.sina.com.cn/s/blog_7cb4384d0100qs7f.html 感觉本题关键是要想到[当a-b>b时先手必胜],后面的就只跟奇偶性有关了 ...
- memmove和memcpy 以及strcmp strcpy几个库函数的实现
memmove和memcpy 1.memmove 函数原型:void *memmove(void *dest, const void *source, size_t count) 返回值说明:返回指向 ...
- Unity3d - 初学篇 Event Functions 的 继承 机制
我们知道Start() Update() 等之类的 事件函数 在Unity 主线程中是依次调用的.至于调用的顺序可以查手册. 由此继承机制也会发生一些改变. 测试一: public class MyT ...
- linux源码阅读笔记 void 指针
void 指针的步长为1,而其他类型的指针的步长与其所定义的数据结构有关. example: 1 #include<stdio.h> 2 main() 3 { 4 int a[10]; 5 ...