本地测没问题,CF上TLE on #13
查看原帖
本地测没问题,CF上TLE on #13
540333
__xzm__楼主2023/11/9 19:56

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;
}
2023/11/9 19:56
加载中...