simpson积分法做得,莫名TLE
本地测了#13,也跑的飞快
//#pragma GCC optimize(2)
//#pragma GCC optimize(3, "Ofast", "inline")
#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-8;
struct Circle {
int x, y, r;
} c[3];
double func(double x) {
static double l[3], r[3];
l[1] = r[1] = l[2] = r[2] = 0;
for (int i = 1; i <= 2; i++) {
double d = fabs(c[i].x-x);
if (d > c[i].r) continue;
double len = sqrt(1.0*c[i].r*c[i].r-d*d);
l[i] = c[i].y-len, r[i] = c[i].y+len;
}
return max(min(r[1],r[2])-max(l[1],l[2]), 0.0);
}
double simpson(double l, double r) {
double mid = (l+r)/2;
return (func(l)+func(r)+func(mid)*4)/6*(r-l);
}
double asr(double l, double r, double s, int step) {
double mid = (l+r)/2;
double ls = simpson(l, mid), rs = simpson(mid, r);
if (fabs(ls+rs-s) < eps && step < 0) return s;
return asr(l, mid, ls, step-1)+asr(mid, r, rs, step-1);
}
int main() {
int mx = -2e9, mi = 2e9;
for (int i = 1; i <= 2; i++) {
scanf("%d%d%d", &c[i].x, &c[i].y, &c[i].r);
mx = max(mx, c[i].x+c[i].r);
mi = min(mi, c[i].x-c[i].r);
}
printf("%.8lf\n", asr(mi, mx, simpson(mi, mx), 12));
return 0;
}