精度锅(
http://codeforces.com/contest/600/submission/14533609
#includeusing namespace std; struct Circle{ long double x,y; long double r; }; ///static long double pi = 3.1415926535897932384626433832795028841971693993751058; long double calArea(Circle c1, Circle c2) { long double d; long double s, s1, s2, s3, angle1, angle2; d = sqrt((c1.x - c2.x) * (c1.x - c2.x) + (c1.y - c2.y) * (c1.y - c2.y)); if(d >= (c1.r + c2.r))//两圆相离 return 0; if((c1.r - c2.r) >= d)//两圆内含,c1大 return acos(-1.0) * c2.r * c2.r; if((c2.r - c1.r) >= d)//两圆内含,c2大 return acos(-1.0) * c1.r * c1.r; angle1 = acos((c1.r * c1.r + d*d - c2.r * c2.r) / (2 * c1.r * d)); angle2 = acos((c2.r * c2.r + d*d - c1.r * c1.r) / (2 * c2.r * d)); s1 = angle1 * c1.r * c1.r; s2 = angle2 * c2.r * c2.r; if (c1.r > c2.r) s3 = c1.r * d * sin(angle1); else s3 = c2.r * d * sin(angle2); s = s1 + s2 - s3; return s; } int main() { ios::sync_with_stdio(false); Circle c1, c2; cin >> c1.x >> c1.y >> c1.r; cin >> c2.x >> c2.y >> c2.r; printf("%.20lf", calArea(c1, c2)); return 0; }