bzoj1043

每次做计算几何题都要做好久

考虑每个圆对答案的贡献,也就是每个圆被后面圆覆盖还有多少

可以把覆盖当成盖住一段弧度,看最后有多少没被覆盖

这就相当于线段覆盖问题了,

推推公式,算极角然后排序即可

md,pascal算极角就是麻烦

  1 uses math;
  2 const pi=3.1415926535897932384626433832795;
  3       eps=1e-4;
  4 type node=record
  5        l,r:double;
  6      end;
  7
  8 var q:array[0..2010] of node;
  9     x,y,r:array[0..2010] of double;
 10     t,j,i,n:longint;
 11     ans:double;
 12
 13 function dis(i,j:longint):double;
 14   begin
 15     exit(sqrt(sqr(x[i]-x[j])+sqr(y[i]-y[j])));
 16   end;
 17
 18 function have(i,j:longint):boolean;
 19   begin
 20     exit(r[j]-r[i]>=dis(i,j));
 21   end;
 22
 23 procedure swap(var a,b:node);
 24   var c:node;
 25   begin
 26     c:=a;
 27     a:=b;
 28     b:=c;
 29   end;
 30
 31 function get(x,y:double):double;
 32   begin
 33     if x=0 then
 34     begin
 35       if y>0 then exit(pi/2)
 36       else exit(-pi/2);
 37     end;
 38     get:=arctan(y/x);
 39     if (x<0) then get:=get+pi;
 40   end;
 41
 42 procedure sort(l,r:longint);
 43   var i,j:longint;
 44       x:double;
 45   begin
 46     i:=l;
 47     j:=r;
 48     x:=q[(l+r) shr 1].l;
 49     repeat
 50       while q[i].l<x do inc(i);
 51       while x<q[j].l do dec(j);
 52       if not(i>j) then
 53       begin
 54         swap(q[i],q[j]);
 55         inc(i);
 56         dec(j);
 57       end;
 58     until i>j;
 59     if l<j then sort(l,j);
 60     if i<r then sort(i,r);
 61   end;
 62
 63 function cal(j:longint):double;
 64   var i:longint;
 65       d,now,l,z,an:double;
 66   begin
 67     for i:=j+1 to n do
 68       if have(j,i) then exit(0);
 69     t:=0;
 70     for i:=j+1 to n do
 71     begin
 72       d:=dis(i,j);
 73       if not have(i,j) and (r[j]+r[i]>d) then
 74       begin
 75         inc(t);
 76         an:=get(x[i]-x[j],y[i]-y[j]);
 77         l:=(sqr(r[j])-sqr(r[i])+sqr(d))/(2*d);
 78         z:=arccos(l/r[j]);
 79         q[t].l:=an-z;
 80         q[t].r:=an+z;
 81      //   writeln(an,‘ ‘,z,‘ ‘,i,‘ ‘,x[i]-x[j],‘ ‘,y[i]-y[j]);
 82      //   readln;
 83       end;
 84     end;
 85     for i:=1 to t do
 86     begin
 87       if q[i].l>2*pi then q[i].l:=q[i].l-2*pi;
 88       if q[i].r>2*pi then q[i].r:=q[i].r-2*pi;
 89       if q[i].l<0 then q[i].l:=q[i].l+2*pi;
 90       if q[i].r<0 then q[i].r:=q[i].r+2*pi;
 91       if q[i].l>q[i].r then
 92       begin
 93         inc(t);
 94         q[t].l:=0;
 95         q[t].r:=q[i].r;
 96         q[i].r:=2*pi;
 97       end;
 98     end;
 99     sort(1,t);
100     cal:=0;
101     now:=0;
102     for i:=1 to t do
103       if q[i].l>now then
104       begin
105         cal:=cal+(q[i].l-now);
106         now:=q[i].r;
107       end
108       else if now<q[i].r then now:=q[i].r;
109
110     cal:=cal+2*pi-now;
111     if cal<0 then cal:=0;
112     cal:=cal*r[j];
113   end;
114
115 begin
116   readln(n);
117   for i:=1 to n do
118     readln(r[i],x[i],y[i]);
119
120   for i:=1 to n do
121     ans:=ans+cal(i);
122
123   writeln(ans:0:3);
124 end.

时间: 2024-08-11 16:30:21

bzoj1043的相关文章

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

[BZOJ1043][HAOI2008]下落的圆盘 Description 有n个圆盘从天而降,后面落下的可以盖住前面的.求最后形成的封闭区域的周长.看下面这副图, 所有的红色线条的总长度即为所求.  Input 第一行为1个整数n,N<=1000接下来n行每行3个实数,ri,xi,yi,表示下落时第i个圆盘的半径和圆心坐标. Output 最后的周长,保留三位小数 Sample Input 2 1 0 0 1 1 0 Sample Output 10.472 题解:对于每个圆,我们枚举它后面的

bzoj1043 下落的圆盘

Description 有n个圆盘从天而降,后面落下的可以盖住前面的.求最后形成的封闭区域的周长.看下面这副图, 所有的红色线条的总长度即为所求.  Input 第一行为1个整数n,N<=1000接下来n行每行3个实数,ri,xi,yi,表示下落时第i个圆盘的半径和圆心坐标. Output 最后的周长,保留三位小数 对每个圆,若没被后面的圆完全覆盖,就统计后面的圆覆盖的圆周长度,具体实现可以求出圆周上每个被覆盖区间并取并 #include<cstdio> #include<cmat

BZOJ1043 [HAOI2008]下落的圆盘

倒过来做,然后就变成了线段覆盖问题了. 线段覆盖就是贪心即可... 但是好烦好烦= =,需要耐心和几何基础2333 1 /************************************************************** 2 Problem: 1043 3 User: rausen 4 Language: C++ 5 Result: Accepted 6 Time:240 ms 7 Memory:872 kb 8 ****************************

【bzoj1043】[HAOI2008]下落的圆盘 计算几何

题目描述 有n个圆盘从天而降,后面落下的可以盖住前面的.求最后形成的封闭区域的周长.看下面这副图, 所有的红色线条的总长度即为所求. 输入 第一行为1个整数n,N<=1000接下来n行每行3个实数,ri,xi,yi,表示下落时第i个圆盘的半径和圆心坐标. 输出 最后的周长,保留三位小数 样例输入 2 1 0 0 1 1 0 样例输出 10.472 题解 计算几何 考虑从下到上的每一个圆,它被其它的圆覆盖了多少.即考虑它被覆盖了多少弧度. 考虑两个圆,如果相离则不覆盖,内含判断一下包含关系. 如果

【BZOJ1043】【HAOI2008】下落的圆盘 计算几何

链接: #include <stdio.h> int main() { puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/46564199"); } 题解: 给每个圆求一下: 1. 它是不是被之后的某圆整体覆盖. 2. 它的圆周上有哪些弧段被覆盖了. 然后对于每个圆求一下还剩多少周长即可. 上述的"2."可以用圆的圆心角

BZOJ1043:[HAOI2008]下落的圆盘——题解

http://www.lydsy.com/JudgeOnline/problem.php?id=1043 Description 有n个圆盘从天而降,后面落下的可以盖住前面的.求最后形成的封闭区域的周长.看下面这副图, 所有的红 色线条的总长度即为所求. Input 第一行为1个整数n,N<=1000 接下来n行每行3个实数,ri,xi,yi,表示下落时第i个圆盘的半径和圆心坐标. Output 最后的周长,保留三位小数 Sample Input 2 1 0 0 1 1 0 Sample Out

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

1043: [HAOI2008]下落的圆盘 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1598  Solved: 676[Submit][Status][Discuss] Description 有n个圆盘从天而降,后面落下的可以盖住前面的.求最后形成的封闭区域的周长.看下面这副图, 所有的红色线条的总长度即为所求.  Input 第一行为1个整数n,N<=1000接下来n行每行3个实数,ri,xi,yi,表示下落时第i个圆盘的半径和圆心坐标

bzoj刷题(shui)记录

放假刷了一个月的水题,集中写一下题解吧. bzoj1858:线段树随便维护一下. code bzoj2705:莫比乌斯反演裸题. code bzoj1202:并查集,但是我写了一种跟floyd很像的奇怪的东西. code bzoj1072:暴力. bzoj2431:dp f[i][j]=sum(f[i-1],[k]) code bzoj3505:组合数学. code bzoj1058:两棵平衡树. code bzoj1922:维护两个距离,然后更新答案. code bzoj1009:之前写过题解

[转载]hzwer的bzoj题单

counter: 664BZOJ1601 BZOJ1003 BZOJ1002 BZOJ1192 BZOJ1303 BZOJ1270 BZOJ3039 BZOJ1191 BZOJ1059 BZOJ1202 BZOJ1051 BZOJ1001 BZOJ1588 BZOJ1208 BZOJ1491 BZOJ1084 BZOJ1295 BZOJ3109 BZOJ1085 BZOJ1041 BZOJ1087 BZOJ3038 BZOJ1821 BZOJ1076 BZOJ2321 BZOJ1934 BZOJ