Submission #1094862

#TimeUsernameProblemLanguageResultExecution timeMemory
1094862KodikBalloons (CEOI11_bal)C++17
100 / 100
124 ms6996 KiB
#include <bits/stdc++.h> using namespace std; #define ss second #define ff first typedef long long ll; typedef long double ld; #define int ll const int PRECISION = 3; /* * how long can the radius of the new balloon at position bx be * so that it touches the ballon a, which is described by * its x position a.first and its radius a.second */ double calc_r(pair<double, double> a, double bx) { return (a.first - bx) * (a.first - bx) / (4 * a.second); } signed main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); int n; cin >> n; // the radius of each balloon after inflating vector<double> final_radius(n); // the balloons we should check when we add a new one stack<pair<double, double>> to_check; for (int i = 0; i < n; i++) { double x, r; cin >> x >> r; // the maximum radius of the current balloon double max_r = r; /* * as long as the stack is not empty, we want to check * if the last balloon makes the radius of the current balloon smaller */ while (!to_check.empty()) { pair<double, double> last = to_check.top(); // the radius if the current balloon touches the last balloon double to_last_r = calc_r(last, x); /* * the maximum possible radius is the smaller one between current * maximum and the maximum radius so that we touches the last * balloon (by which we have to stop) */ max_r = min(max_r, to_last_r); /* * if current maximum radius >= radius of the last balloon, we can * remove the last balloon since it will never be touched by any * new balloons other than the current one */ if (max_r >= last.second) { to_check.pop(); // check the next balloon saved which will possibly reduce max_r continue; } /* * otherwise, the current balloon is smaller than the last saved * balloon and we can stop checking */ else { break; } } /* * save the x coordinate and radius of the current balloon, so that * it can be checked later when a new balloon being inflated */ to_check.push({x, max_r}); final_radius[i] = max_r; } cout << fixed << setprecision(PRECISION); for (double &r : final_radius) { cout << r << "\n"; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...