Submission #1159979

#TimeUsernameProblemLanguageResultExecution timeMemory
1159979jaredBalloons (CEOI11_bal)C++20
100 / 100
230 ms6516 KiB
#include "bits/stdc++.h" #define int long long #define double long double using namespace std; int n; vector<int> d; vector<double> r; signed main() { cin.tie(nullptr); ios_base::sync_with_stdio(false); cin >> n; d.resize(n); r.resize(n); for (int i = 0; i < n; i++) { cin >> d[i] >> r[i]; } // (r_1 + r_2)^2 = (d_2 - d_1)^2 + (r_1 - r_2)^2 // r_1^2 + 2r_1r_2 + r_2^2 = (d_2 - d_1)^2 + r_1^2 - 2r_1r_2 + r_2^2 // 4r_1_r_2 = (d_2 - d_1)^2 // r_2 = (d_2 - d_1)^2 / 4r_1 // Consider balloon a and b (a < b), if r_a <= r_b, // balloon b blocks balloon a completely, when there is a new balloon after b // we do not have to check balloon a stack<int> mono; for (int i = 0; i < n; i++) { double size = r[i]; while (!mono.empty()) { int j = mono.top(); size = min(size, (d[i] - d[j]) * (d[i] - d[j]) / 4.l / r[j]); if (size >= r[j]) // balloon j does not 'block' balloon i completely, need to check larger balloon before j mono.pop(); else break; } mono.push(i); r[i] = size; cout << fixed << setprecision(3) << size << endl; } 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...