#include <bits/stdc++.h>
using namespace std;
double calc(int x1, double r1, int x2, double r2) {
// binary search on circle size
double low = 0, high = r2;
for (int t = 0; t < 30; t ++) {
double mid = (low + high)/2;
// xcoordinate at (x1, r1) and (x2, mid)
double dist = pow((double)(x1 - x2), 2) + pow(r1 - mid, 2);
if (pow(r1 + mid, 2) <= dist) low = mid;
else high = mid;
}
return low;
}
int main() {
int N;
cin >> N;
stack<pair<int, double>> st; // {x coordinate, size}
for (int i = 1; i <= N; i ++) {
int x;
double r;
cin >> x >> r;
while (st.size() >= 2) {
// check if the last thing can be popped off
auto [a, b] = st.top();
st.pop();
auto [c, d] = st.top();
st.push({a, b});
if (calc(a, b, x, r) > calc(c, d, x, r)) {
st.pop();
} else break;
}
// check the top 2 in the stack
if (st.empty()) {
cout << fixed << setprecision(3) << r << "\n";
st.push({x, r});
} else {
auto [a, b] = st.top();
r = calc(a, b, x, r);
cout << fixed << setprecision(3) << r << "\n";
st.push({x, r});
}
}
}
# | 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... |