#include <bits/stdc++.h>
#define _ ios_base::sync_with_stdio(0);cin.tie(0);
#define endl '\n'
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
typedef long long ll;
using namespace std;
typedef double ld;
const ld DINF = 1e18;
const ld pi = acos(-1.0);
const ld eps = 1e-9;
#define sq(x) ((x)*(x))
bool eq(ld a, ld b) {
return abs(a - b) <= eps;
}
struct pt { // ponto
ld x, y;
pt(ld x_ = 0, ld y_ = 0) : x(x_), y(y_) {}
bool operator < (const pt p) const {
if (!eq(x, p.x)) return x < p.x;
if (!eq(y, p.y)) return y < p.y;
return 0;
}
bool operator == (const pt p) const {
return eq(x, p.x) and eq(y, p.y);
}
pt operator + (const pt p) const { return pt(x+p.x, y+p.y); }
pt operator - (const pt p) const { return pt(x-p.x, y-p.y); }
pt operator * (const ld c) const { return pt(x*c , y*c ); }
pt operator / (const ld c) const { return pt(x/c , y/c ); }
ld operator * (const pt p) const { return x*p.x + y*p.y; }
ld operator ^ (const pt p) const { return x*p.y - y*p.x; }
friend istream& operator >> (istream& in, pt& p) {
return in >> p.x >> p.y;
}
};
ld dist(pt p, pt q) { // distancia
return hypot(p.y - q.y, p.x - q.x);
}
pt rotate90(pt p) { // rotaciona 90 graus
return pt(-p.y, p.x);
}
vector<pt> circ_inter(pt a, pt b, ld r, ld R) { // intersecao da circunf (a, r) e (b, R)
vector<pt> ret;
ld d = dist(a, b);
if (d > r+R or d+min(r, R) < max(r, R)) return ret;
ld x = (d*d-R*R+r*r)/(2*d);
ld y = sqrt(r*r-x*x);
pt v = (b-a)/d;
ret.push_back(a+v*x + rotate90(v)*y);
if (y > 0) ret.push_back(a+v*x - rotate90(v)*y);
return ret;
}
int solve() {
int n; cin >> n;
vector<array<int, 2>> A(n);
for (auto& [x, r] : A) {
cin >> x >> r;
}
vector<ld> R(n);
stack<int> S;
for (int i = 0; i < n; i++) {
ld rr = A[i][1];
while (S.size() and !circ_inter(
pt(A[S.top()][0], R[S.top()]),
pt(A[i][0], rr),
R[S.top()],
rr
).empty()) {
ld l = 0.0, r = rr;
for (int rep = 0; rep < 100; rep++) {
ld mid = 0.5 * (l + r);
if (circ_inter(pt(A[S.top()][0], R[S.top()]), pt(A[i][0], mid), R[S.top()], mid).empty()) {
l = mid;
} else {
r = mid;
}
}
rr = l;
S.pop();
}
R[i] = rr;
S.push(i);
}
for (int i = 0; i < n; i++) {
cout << fixed << setprecision(5) << R[i] << " \n"[i == n-1];
}
return(0);
}
int main()
{
_;
int t = 1; //cin >> t;
while (t--) {
solve();
}
return(0);
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |