码迷,mamicode.com
首页 > 其他好文 > 详细

BZOJ1043 [HAOI2008]下落的圆盘

时间:2014-11-25 22:49:35      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   ar   color   os   sp   for   

倒过来做,然后就变成了线段覆盖问题了。

线段覆盖就是贪心即可。。。

但是好烦好烦= =,需要耐心和几何基础2333

 

bubuko.com,布布扣
 1 /**************************************************************
 2     Problem: 1043
 3     User: rausen
 4     Language: C++
 5     Result: Accepted
 6     Time:240 ms
 7     Memory:872 kb
 8 ****************************************************************/
 9  
10 #include <cstdio>
11 #include <cmath>
12 #include <algorithm>
13  
14 using namespace std;
15 typedef double lf;
16 typedef pair <lf, lf> Pair;
17 const lf pi = 3.1415926536;
18 const int N = 1005;
19  
20 struct point {
21     lf x, y;
22 };
23 typedef point P;
24  
25 struct circle {
26     P o;
27     lf r;
28 }a[N];
29 typedef circle C;
30  
31 int n, tot;
32 lf ans;
33 Pair inter[N << 1];
34  
35 inline lf Sqr(lf x) {
36     return x * x;
37 }
38  
39 inline lf dist(const P & a, const P &b) {
40     return sqrt(Sqr(a.x - b.x) + Sqr(a.y - b.y));
41 }
42  
43 inline lf K(const P &a, const P &b) {
44     return atan2(a.y - b.y, a.x - b.x);
45 }
46  
47 void Calc (C O1, C O2, lf &dis) {
48     lf alpha = K(O1.o, O2.o) + pi,
49     delta = acos((Sqr(O1.r) + Sqr(dis) - Sqr(O2.r)) / (2 * O1.r * dis));
50     Pair tmp = make_pair(alpha - delta, alpha + delta);
51     if (tmp.first >= 0 && tmp.second <= 2 * pi)
52         inter[++tot] = tmp; 
53     else if (tmp.first < 0)
54         inter[++tot] = make_pair(tmp.first + 2 * pi, 2 * pi),
55         inter[++tot] = make_pair(0, tmp.second);
56     else
57         inter[++tot] = make_pair(tmp.first, 2 * pi),
58         inter[++tot] = make_pair(0, tmp.second - 2 * pi);
59 }
60  
61 lf Union() {
62     int i;
63     lf res = 0, st = -1, ed = -1;
64     sort(inter + 1, inter + tot + 1);
65     for (i = 1; i <= tot; ++i) {
66         if (inter[i].first > ed) {
67             res += ed - st;
68             st = inter[i].first, ed = inter[i].second;
69         } else
70             ed = max(ed, inter[i].second);
71     }
72     res += ed - st;
73     return 2 * pi - res;
74 }
75  
76 int main() {
77     int i, j;
78     lf dis;
79     scanf("%d\n", &n);
80     for (i = n; i; --i)
81         scanf("%lf%lf%lf", &a[i].r, &a[i].o.x, &a[i].o.y);
82     for (i = 1; i <= n; ++i) {
83         tot = 0;
84         for (j = 1; j < i; ++j) {
85             dis = dist(a[i].o, a[j].o);
86             if (a[j].r - a[i].r > dis) break;
87             if (a[i].r + a[j].r > dis && fabs(a[i].r - a[j].r) < dis)
88                 Calc(a[i], a[j], dis);
89         }
90         if (j == i)
91             ans += Union() * a[i].r;
92     }
93     printf("%.3lf\n", ans);
94     return 0;
95 }
View Code

 

BZOJ1043 [HAOI2008]下落的圆盘

标签:style   blog   http   io   ar   color   os   sp   for   

原文地址:http://www.cnblogs.com/rausen/p/4121676.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!