题解:P6376 [PA 2010] The Goat
WorldMachine · · 题解
数 ❤ 值 ❤ 积 ❤ 分 ❤ 真 ❤ 是 ❤ 杂 ❤ 鱼 ❤ 呢
对于平面上的某个点
设平面上至少被
而区域
时间复杂度为
#include <bits/stdc++.h>
using namespace std;
#define il inline
const int N = 1e3 + 5; const double pi = acos(-1);
double x[N], y[N], f[N], g[N], e;
il double qpow(double a, int b) { double c = 1; while (b) { if (b & 1) c *= a; a *= a, b >>= 1; } return c; }
int main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n, k; double r; cin >> n >> k >> r;
for (int i = 1; i <= n; i++) cin >> x[i] >> y[i], f[i] = 1 - qpow(1 - (double)i / n, k);
for (int i = 0; i < n; i++) g[i] = f[i + 1] - f[i];
for (int i = 1; i <= n; i++) {
typedef pair<double, int> node;
basic_string<node> v; int c = 0; v += {pi, 0};
for (int j = 1; j <= n; j++) if (i ^ j) {
if (x[i] == x[j] && y[i] == y[j]) { c += j > i; continue; }
double dx = x[j] - x[i], dy = y[j] - y[i], d = hypot(dx, dy); if (d >= 2 * r) continue;
double t = atan2(dy, dx), dt = acos(d / (2 * r)), l = t - dt, r = t + dt;
if (l <= -pi) c++, v += {r, -1}, v += {l + 2 * pi, 1};
else if (r > pi) c++, v += {r - 2 * pi, -1}, v += {l, 1};
else v += {l, 1}, v += {r, -1};
} sort(v.begin(), v.end(), [](const node &a, const node &b) { return a.first < b.first; });
auto H = [&](double t) -> double { return (r * r * t + r * x[i] * sin(t) - r * y[i] * cos(t)) * 0.5; };
int cc = c; double ct = -pi, cs = 0;
for (auto [t, w] : v) { if (cc >= 0 && cc < n) cs += g[cc] * (H(t) - H(ct)); ct = t, cc += w; } e += cs;
} cout << fixed << setprecision(15) << e;
}