题意(可以直接看代码部分,有题意翻译,os:有点简略)
代码&题解啥的
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 3e5 + 5;
const double eps = 1e-8;
int sgn(double x) {
if (fabs(x) < eps) return 0;
if (x > 0) return 1;
return -1;
}
double r1, r2;
vector<double> v;
int n;
double C(double r1, double r2) {
return (r1 * r2) / (r1 + r2 + 2.0 * sqrt(r1 * r2));
}
double X(double x, double r1) { return sqrt(4.0 * r1 * x); }
struct Point {
double x, r;
Point(double x = 0.0, double r = 0.0) : x(x), r(r) {}
} p1, p2, p3;
struct node {
Point L, R;
node(Point L = Point(0.0, 0.0), Point R = Point(0.0, 0.0)) : L(L), R(R) {}
bool operator<(const node &b) const {
double x1 = C(L.r, R.r), x2 = C(b.L.r, b.R.r);
if (sgn(x1 - x2) == 0) return sgn(L.x - b.L.x) < 0;
return sgn(x1 - x2) < 0;
}
};
priority_queue<node> q;
signed main() {
cin >> r1 >> r2 >> n;
double x1, x2, x3, x = C(r1, r2);
v.push_back(x);
x1 = 0.0, x2 = x1 + X(x, r1), x3 = x1 + X(x, r1) + X(x, r2);
p1 = Point(x1, r1), p2 = Point(x2, x), p3 = Point(x3, r2);
q.push(node(p1, p2));
q.push(node(p2, p3));
while (v.size() < n) {
node now = q.top();
q.pop();
Point L = now.L, R = now.R;
x = C(L.r, R.r);
v.push_back(x);
p2 = Point(L.x + X(x, L.r), x);
q.push(node(L, p2));
q.push(node(p2, R));
}
for (auto i : v) printf("%.6lf ", i);
return 0;
}