• SPOJ


    CIRU - The area of the union of circles

    no tags 

    You are given N circles and expected to calculate the area of the union of the circles !

    Input

    The first line is one integer n indicates the number of the circles. (1 <= n <= 1000)

    Then follows n lines every line has three integers

    Xi Yi Ri

    indicates the coordinate of the center of the circle, and the radius. (|Xi|. |Yi|  <= 1000, Ri <= 1000)

    Note that in this problem Ri may be 0 and it just means one point !

    Output

    The total area that these N circles with 3 digits after decimal point

    Example

    Input:
    3
    0 0 1
    0 0 1
    100 100 1


    Output:
    6.283
    题意:求圆的面积并
    解法:simpson积分,递归至左右区间积分和与大区间积分的差值小于EPS
     1 #include <iostream>
     2 #include <fstream>
     3 #include <sstream>
     4 #include <cstdlib>
     5 #include <cstdio>
     6 #include <cmath>
     7 #include <string>
     8 #include <cstring>
     9 #include <algorithm>
    10 #include <queue>
    11 #include <stack>
    12 #include <vector>
    13 #include <set>
    14 #include <map>
    15 #include <list>
    16 #include <iomanip>
    17 #include <cctype>
    18 #include <cassert>
    19 #include <bitset>
    20 #include <ctime>
    21  
    22 using namespace std;
    23  
    24 #define pau system("pause")
    25 #define ll long long
    26 #define pii pair<int, int>
    27 #define pb push_back
    28 #define pli pair<ll, int>
    29 #define pil pair<int, ll>
    30 #define pdd pair<double, double>
    31 #define clr(a, x) memset(a, x, sizeof(a))
    32  
    33 const double pi = acos(-1.0);
    34 const int INF = 0x3f3f3f3f;
    35 const int MOD = 1e9 + 7;
    36 const double EPS = 1e-9;
    37  
    38 /*
    39 #include <ext/pb_ds/assoc_container.hpp>
    40 #include <ext/pb_ds/tree_policy.hpp>
    41 using namespace __gnu_pbds;
    42 #define TREE tree<pli, null_type, greater<pli>, rb_tree_tag, tree_order_statistics_node_update>
    43 TREE T;
    44 */
    45  
    46 struct Circle {
    47     double x, y, r;
    48     Circle () {}
    49     Circle (double x, double y, double r) : x(x), y(y), r(r) {}
    50 } c[1005];
    51 int n;
    52 double Cut(double x) {
    53     pdd arr[1005];
    54     int index = 0;
    55     for (int i = 1; i <= n; ++i) {
    56         if (fabs(x - c[i].x) < c[i].r) {
    57             double dd = sqrt(c[i].r * c[i].r - (x - c[i].x) * (x - c[i].x));
    58             arr[++index] = pdd(c[i].y - dd, c[i].y + dd);
    59         }
    60     }
    61     sort(arr + 1, arr + index + 1);
    62     double res = 0, ma = -INF;
    63     for (int i = 1; i <= index; ++i) {
    64         res += max(0.0, arr[i].second - max(arr[i].first, ma));
    65         ma = max(ma, arr[i].second);
    66     }
    67     return res;
    68 }
    69 double simpson(double l, double r, double fl, double fr) {
    70     double fmi = Cut((l + r) * 0.5);
    71     return (r - l) / 6.0 * (fl + 4 * fmi + fr);
    72 }
    73 double solve(double l, double r) {
    74     double mi = (l + r) * 0.5;
    75     double fmi = Cut(mi), fl = Cut(l), fr = Cut(r);
    76     double ans = simpson(l, r, fl, fr);
    77     double ans1 = simpson(l, mi, fl, fmi);
    78     double ans2 = simpson(mi, r, fmi, fr);
    79     if (r - l < 1 && fabs(ans1 + ans2 - ans) < EPS) return ans1 + ans2;
    80     return solve(l, mi) + solve(mi, r);
    81 }
    82 int main() {
    83     scanf("%d", &n);
    84     for (int i = 1; i <= n; ++i) {
    85         scanf("%lf%lf%lf", &c[i].x, &c[i].y, &c[i].r);
    86     }
    87     printf("%.3f
    ", solve(-2000, 2000));    
    88     return 0;
    89 }
    90  
    View Code


  • 相关阅读:
    JS判断单选框是否选中
    Js判断是否有属性
    判断是否有焦点
    Js 替代
    Js解析json
    回车事件
    js解析XML
    Linux常用基础(三)
    Linux常用基础(二)
    Linux常用基础(一)
  • 原文地址:https://www.cnblogs.com/BIGTOM/p/9814999.html
Copyright © 2020-2023  润新知