#include <algorithm>
#include <cstdio>
#include <sstream>
#include <cstdlib>
#include <cctype>
#include <cmath>
#include <set>
#include <queue>
#include <stack>
#include <list>
#include <iostream>
#include <fstream>
#include <numeric>
#include <string>
#include <vector>
#include <cstring>
#include <map>
#include <iterator>
#include <deque>
#include <climits>
#include <complex>
#include <bitset>
#include <limits>
using namespace std;
const double EPS = 1e-8;
const double PI = acos(-1.0);
const double TAU = 2.0 * PI;
const double INF = 1e99;
int sig(double x) {return x < -EPS ? -1 : x > EPS ? 1 : 0;}
template<class T> T pow2(T x) {return x * x;}
class Vector {
public:
double x, y;
Vector() {}
Vector(double x, double y): x(x), y(y) {}
Vector operator -() const {return Vector(-x, -y);}
Vector operator +(const Vector &v) const {return Vector(x+v.x, y+v.y);}
Vector operator -(const Vector &v) const {return Vector(x-v.x, y-v.y);}
Vector operator *(const double &s) const {return Vector(x * s, y * s);}
Vector operator /(const double &s) const {return Vector(x / s, y / s);}
double operator *(const Vector &v) const {return x*v.x + y*v.y;}
double operator ^(const Vector &v) const {return x*v.y - y*v.x;}
// rotate vector (Right/Left hand)
Vector R(double co, double si) {return Vector(x*co-y*si, y*co+x*si);}
Vector L(double co, double si) {return Vector(x*co+y*si, y*co-x*si);}
Vector R(double th) {return R(cos(th), sin(th));}
Vector L(double th) {return L(cos(th), sin(th));}
double len2() {return x*x + y*y;}
double len() {return sqrt(len2());}
double ang() {return atan2(y, x);} // angle of vector
Vector e(double s = 1.0) {return *this / len() * s;}
};
typedef Vector Point;
class Line {
public:
Point a, b;
Line() {}
Line(Point a, Point b): a(a), b(b) {}
};
class Circle {
public:
Point o;
double r;
Circle() {}
Circle(Point o, double r): o(o), r(r) {}
// (d < R - r) ----> -2
// (d = R - r) ----> -1
// (d = 0)
// (R - r < d < R + r) ----> 0
// (d = R + r) ----> 1
// (d > R + r) ----> 2
int posi(Circle c) {
double d = (o - c.o).len();
int in = sig(d - fabs(r - c.r)), ex = sig(d - (r + c.r));
return in<0 ? -2 : in==0? -1 : ex==0 ? 1 : ex>0? 2 : 0;
}
Line chord(Circle c) {
Vector v = c.o - o;
double co = (pow2(r) + v.len2() - pow2(c.r)) / (2 * r * v.len());
double si = sqrt(fabs(1.0 - pow2(co)));
return Line(v.L(co, si).e(r) + o, v.R(co, si).e(r) + o);
}
};
// -PI <= th <= PI
struct Range {
double t;
int evt;
Point p;
Range() {}
Range(double t, int evt, Point p) : t(t), evt(evt), p(p) {}
bool operator <(const Range &s) const {
return sig(t - s.t) < 0 || (sig(t - s.t) == 0 && evt > s.evt);
}
};
const int MAX_N = 1000 + 10;
Circle C[MAX_N];
Range R[MAX_N<<1];
bool cmp_r(const Circle &a, const Circle &b) {
return a.r > b.r;
}
double segment_area(double r, double t) {
return pow2(r) * (t - sin(t)) / 2;
}
double union_circle(Circle C[], int &n)
{
sort(C, C + n, cmp_r);
int k = 0;
for (int i = 0; i < n; i++) {
if (sig(C[i].r) == 0) break;
int j = 0;
for (j = 0; j < k; j++)
if (C[i].posi(C[j]) < 0 || !sig((C[i].o - C[j].o).len()))
break;
if (j == k)
C[k++] = C[i];
}
n = k;
double ans = 0;
for (int i = 0; i < n; ++ i)
{
Point mpi = Point(- C[i].r, 0.0) + C[i].o;
int nc = 0, rcnt = 0;
R[rcnt++] = Range(-PI, 1, mpi);
R[rcnt++] = Range( PI, -1, mpi);
for (int j = 0; j < n; ++ j)
{
if (j == i || C[i].posi(C[j])) continue;
Line l = C[i].chord(C[j]);
double jR = (l.a - C[i].o).ang(), jL = (l.b - C[i].o).ang();
if (sig(jR - jL) > 0) ++ nc;
R[rcnt++] = Range(jR, 1, l.a);
R[rcnt++] = Range(jL, -1, l.b);
}
sort(R, R + rcnt);
double pj = - PI;
Point pp = mpi;
for(int j = 0; j < rcnt; ++ j)
{
nc += R[j].evt;
if((nc == 2 && R[j].evt > 0) || nc == 0)
ans += segment_area(C[i].r, R[j].t - pj) + (pp ^ R[j].p) / 2;
pj = R[j].t; pp = R[j].p;
}
}
return ans;
}
int main(int argc, char *argv[])
{
int n;
while (scanf("%d", &n) != EOF) {
for (int i = 0; i < n; i++)
scanf("%lf%lf%lf", &C[i].o.x, &C[i].o.y, &C[i].r);
double ans = union_circle(C, n);
printf("%.5lf\n", ans);
}
return 0;
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGNzdGRpbz4KI2luY2x1ZGUgPHNzdHJlYW0+CiNpbmNsdWRlIDxjc3RkbGliPgojaW5jbHVkZSA8Y2N0eXBlPgojaW5jbHVkZSA8Y21hdGg+CiNpbmNsdWRlIDxzZXQ+CiNpbmNsdWRlIDxxdWV1ZT4KI2luY2x1ZGUgPHN0YWNrPgojaW5jbHVkZSA8bGlzdD4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnN0cmVhbT4KI2luY2x1ZGUgPG51bWVyaWM+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxjc3RyaW5nPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8aXRlcmF0b3I+CiNpbmNsdWRlIDxkZXF1ZT4KI2luY2x1ZGUgPGNsaW1pdHM+CiNpbmNsdWRlIDxjb21wbGV4PgojaW5jbHVkZSA8Yml0c2V0PgojaW5jbHVkZSA8bGltaXRzPgogCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKY29uc3QgZG91YmxlIEVQUyA9IDFlLTg7CmNvbnN0IGRvdWJsZSBQSSAgPSBhY29zKC0xLjApOwpjb25zdCBkb3VibGUgVEFVID0gMi4wICogUEk7CmNvbnN0IGRvdWJsZSBJTkYgPSAxZTk5OwogCmludCBzaWcoZG91YmxlIHgpIHtyZXR1cm4geCA8IC1FUFMgPyAtMSA6IHggPiBFUFMgPyAxIDogMDt9CnRlbXBsYXRlPGNsYXNzIFQ+IFQgcG93MihUIHgpIHtyZXR1cm4geCAqIHg7fQogCiAKY2xhc3MgVmVjdG9yIHsKcHVibGljOgogICAgZG91YmxlIHgsIHk7CiAgICBWZWN0b3IoKSB7fQogICAgVmVjdG9yKGRvdWJsZSB4LCBkb3VibGUgeSk6IHgoeCksIHkoeSkge30KIAogICAgVmVjdG9yIG9wZXJhdG9yIC0oKSBjb25zdCB7cmV0dXJuIFZlY3RvcigteCwgLXkpO30KICAgIFZlY3RvciBvcGVyYXRvciArKGNvbnN0IFZlY3RvciAmdikgY29uc3Qge3JldHVybiBWZWN0b3IoeCt2LngsIHkrdi55KTt9CiAgICBWZWN0b3Igb3BlcmF0b3IgLShjb25zdCBWZWN0b3IgJnYpIGNvbnN0IHtyZXR1cm4gVmVjdG9yKHgtdi54LCB5LXYueSk7fQogICAgVmVjdG9yIG9wZXJhdG9yICooY29uc3QgZG91YmxlICZzKSBjb25zdCB7cmV0dXJuIFZlY3Rvcih4ICogcywgeSAqIHMpO30KICAgIFZlY3RvciBvcGVyYXRvciAvKGNvbnN0IGRvdWJsZSAmcykgY29uc3Qge3JldHVybiBWZWN0b3IoeCAvIHMsIHkgLyBzKTt9CiAKICAgIGRvdWJsZSBvcGVyYXRvciAqKGNvbnN0IFZlY3RvciAmdikgY29uc3Qge3JldHVybiB4KnYueCArIHkqdi55O30KICAgIGRvdWJsZSBvcGVyYXRvciBeKGNvbnN0IFZlY3RvciAmdikgY29uc3Qge3JldHVybiB4KnYueSAtIHkqdi54O30KIAogICAgLy8gcm90YXRlIHZlY3RvciAoUmlnaHQvTGVmdCBoYW5kKQogICAgVmVjdG9yICBSKGRvdWJsZSBjbywgZG91YmxlIHNpKSB7cmV0dXJuIFZlY3Rvcih4KmNvLXkqc2ksIHkqY28reCpzaSk7fQogICAgVmVjdG9yICBMKGRvdWJsZSBjbywgZG91YmxlIHNpKSB7cmV0dXJuIFZlY3Rvcih4KmNvK3kqc2ksIHkqY28teCpzaSk7fQogICAgVmVjdG9yICBSKGRvdWJsZSB0aCkge3JldHVybiBSKGNvcyh0aCksIHNpbih0aCkpO30KICAgIFZlY3RvciAgTChkb3VibGUgdGgpIHtyZXR1cm4gTChjb3ModGgpLCBzaW4odGgpKTt9CiAKICAgIGRvdWJsZSBsZW4yKCkge3JldHVybiB4KnggKyB5Knk7fQogICAgZG91YmxlIGxlbigpICB7cmV0dXJuIHNxcnQobGVuMigpKTt9CiAgICBkb3VibGUgYW5nKCkgIHtyZXR1cm4gYXRhbjIoeSwgeCk7fSAgLy8gYW5nbGUgb2YgdmVjdG9yCiAgICBWZWN0b3IgZShkb3VibGUgcyA9IDEuMCkge3JldHVybiAqdGhpcyAvIGxlbigpICogczt9Cn07CnR5cGVkZWYgVmVjdG9yIFBvaW50OwogCiAKY2xhc3MgTGluZSB7CnB1YmxpYzoKICAgIFBvaW50IGEsIGI7CiAgICBMaW5lKCkge30KICAgIExpbmUoUG9pbnQgYSwgUG9pbnQgYik6IGEoYSksIGIoYikge30KfTsKIApjbGFzcyBDaXJjbGUgewpwdWJsaWM6CiAgICBQb2ludCBvOwogICAgZG91YmxlIHI7CiAgICBDaXJjbGUoKSB7fQogICAgQ2lyY2xlKFBvaW50IG8sIGRvdWJsZSByKTogbyhvKSwgcihyKSB7fQogCiAgICAvLyAoZCA8IFIgLSByKSAgICAgICAgIC0tLS0+IC0yCiAgICAvLyAoZCA9IFIgLSByKSAgICAgICAgIC0tLS0+IC0xCiAgICAvLyAoZCA9IDApCiAgICAvLyAoUiAtIHIgPCBkIDwgUiArIHIpIC0tLS0+ICAwCiAgICAvLyAoZCA9IFIgKyByKSAgICAgICAgIC0tLS0+ICAxCiAgICAvLyAoZCA+IFIgKyByKSAgICAgICAgIC0tLS0+ICAyCiAgICBpbnQgcG9zaShDaXJjbGUgYykgewogICAgICAgIGRvdWJsZSBkID0gKG8gLSBjLm8pLmxlbigpOwogICAgICAgIGludCBpbiA9IHNpZyhkIC0gZmFicyhyIC0gYy5yKSksIGV4ID0gc2lnKGQgLSAociArIGMucikpOwogICAgICAgIHJldHVybiBpbjwwID8gLTIgOiBpbj09MD8gLTEgOiBleD09MCA/IDEgOiBleD4wPyAyIDogMDsKICAgIH0KIAogICAgCiAgICBMaW5lIGNob3JkKENpcmNsZSBjKSB7CiAgICAgICAgVmVjdG9yIHYgPSBjLm8gLSBvOwogICAgICAgIGRvdWJsZSBjbyA9IChwb3cyKHIpICsgdi5sZW4yKCkgLSBwb3cyKGMucikpIC8gKDIgKiByICogdi5sZW4oKSk7CiAgICAgICAgZG91YmxlIHNpID0gc3FydChmYWJzKDEuMCAtIHBvdzIoY28pKSk7CiAgICAgICAgcmV0dXJuIExpbmUodi5MKGNvLCBzaSkuZShyKSArIG8sIHYuUihjbywgc2kpLmUocikgKyBvKTsKICAgIH0KfTsKIAogCi8vIC1QSSA8PSB0aCA8PSBQSQpzdHJ1Y3QgUmFuZ2UgewogICAgZG91YmxlIHQ7CiAgICBpbnQgZXZ0OwogICAgUG9pbnQgcDsKICAgIFJhbmdlKCkge30KICAgIFJhbmdlKGRvdWJsZSB0LCBpbnQgZXZ0LCBQb2ludCBwKSA6IHQodCksIGV2dChldnQpLCBwKHApIHt9CiAKICAgIGJvb2wgb3BlcmF0b3IgPChjb25zdCBSYW5nZSAmcykgY29uc3QgewogICAgICAgIHJldHVybiBzaWcodCAtIHMudCkgPCAwIHx8IChzaWcodCAtIHMudCkgPT0gMCAmJiBldnQgPiBzLmV2dCk7CiAgICB9Cn07CiAKIApjb25zdCBpbnQgTUFYX04gPSAxMDAwICsgMTA7CkNpcmNsZSBDW01BWF9OXTsKUmFuZ2UgUltNQVhfTjw8MV07Cgpib29sIGNtcF9yKGNvbnN0IENpcmNsZSAmYSwgY29uc3QgQ2lyY2xlICZiKSB7CiAgICByZXR1cm4gYS5yID4gYi5yOwp9Cgpkb3VibGUgc2VnbWVudF9hcmVhKGRvdWJsZSByLCBkb3VibGUgdCkgewogICAgcmV0dXJuIHBvdzIocikgKiAodCAtIHNpbih0KSkgLyAyOwp9Cgpkb3VibGUgdW5pb25fY2lyY2xlKENpcmNsZSBDW10sIGludCAmbikKewogICAgc29ydChDLCBDICsgbiwgY21wX3IpOwogICAgaW50IGsgPSAwOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICBpZiAoc2lnKENbaV0ucikgPT0gMCkgYnJlYWs7CiAgICAgICAgaW50IGogPSAwOwogICAgICAgIGZvciAoaiA9IDA7IGogPCBrOyBqKyspCiAgICAgICAgICAgIGlmIChDW2ldLnBvc2koQ1tqXSkgPCAwIHx8ICFzaWcoKENbaV0ubyAtIENbal0ubykubGVuKCkpKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgaWYgKGogPT0gaykKICAgICAgICAgICAgQ1trKytdID0gQ1tpXTsKICAgIH0KICAgIG4gPSBrOwogCiAgICBkb3VibGUgYW5zID0gMDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKysgaSkKICAgIHsKICAgICAgICBQb2ludCBtcGkgPSBQb2ludCgtIENbaV0uciwgMC4wKSArIENbaV0ubzsKICAgICAgICBpbnQgbmMgPSAwLCByY250ID0gMDsKICAgICAgICBSW3JjbnQrK10gPSBSYW5nZSgtUEksICAxLCBtcGkpOwogICAgICAgIFJbcmNudCsrXSA9IFJhbmdlKCBQSSwgLTEsIG1waSk7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuOyArKyBqKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGogPT0gaSB8fCBDW2ldLnBvc2koQ1tqXSkpIGNvbnRpbnVlOwogCiAgICAgICAgICAgIExpbmUgbCA9IENbaV0uY2hvcmQoQ1tqXSk7CiAgICAgICAgICAgIGRvdWJsZSBqUiA9IChsLmEgLSBDW2ldLm8pLmFuZygpLCBqTCA9IChsLmIgLSBDW2ldLm8pLmFuZygpOwogCiAgICAgICAgICAgIGlmIChzaWcoalIgLSBqTCkgPiAwKSArKyBuYzsKICAgICAgICAgICAgUltyY250KytdID0gUmFuZ2UoalIsICAxLCBsLmEpOwogICAgICAgICAgICBSW3JjbnQrK10gPSBSYW5nZShqTCwgLTEsIGwuYik7CiAgICAgICAgfQogICAgICAgIHNvcnQoUiwgUiArIHJjbnQpOwogCiAgICAgICAgZG91YmxlIHBqID0gLSBQSTsKICAgICAgICBQb2ludCAgcHAgPSBtcGk7CiAgICAgICAgZm9yKGludCBqID0gMDsgaiA8IHJjbnQ7ICsrIGopCiAgICAgICAgewogICAgICAgICAgICBuYyArPSBSW2pdLmV2dDsKICAgICAgICAgICAgaWYoKG5jID09IDIgJiYgUltqXS5ldnQgPiAwKSB8fCBuYyA9PSAwKQogICAgICAgICAgICAgICAgYW5zICs9IHNlZ21lbnRfYXJlYShDW2ldLnIsIFJbal0udCAtIHBqKSArIChwcCBeIFJbal0ucCkgLyAyOwogICAgICAgICAgICBwaiA9IFJbal0udDsgcHAgPSBSW2pdLnA7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGFuczsKfQogCmludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCnsKICAgIGludCBuOwogICAgd2hpbGUgKHNjYW5mKCIlZCIsICZuKSAhPSBFT0YpIHsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKICAgICAgICAgICAgc2NhbmYoIiVsZiVsZiVsZiIsICZDW2ldLm8ueCwgJkNbaV0uby55LCAmQ1tpXS5yKTsKIAogICAgICAgIGRvdWJsZSBhbnMgPSB1bmlvbl9jaXJjbGUoQywgbik7CiAgICAgICAgcHJpbnRmKCIlLjVsZlxuIiwgYW5zKTsKICAgIH0KICAgIHJldHVybiAwOwp9