Submission #998897

#TimeUsernameProblemLanguageResultExecution timeMemory
998897hippo123Balloons (CEOI11_bal)C++17
10 / 100
626 ms21668 KiB
#include <bits/stdc++.h> using namespace std; #define pr pair<double, int> #define ll long long #define pb push_back #define f first #define s second vector<double> x, r; set<pr> xr; bool check(double mid, set<pr>::iterator it1, set<pr>::iterator it2, int be){ bool judge=false; for (auto it=it1; it!=it2; it++){ int pos=it->s; double rr=(mid+r[pos])*(mid+r[pos]); double dist1=(mid-r[pos])*(mid-r[pos])+(x[be]-x[pos])*(x[be]-x[pos]); if(rr>=dist1){ judge=true; break; } } return judge; } int main(){ int n; cin>>n; x.resize(n); r.resize(n); for (int i=0; i<n; i++) { cin>>x[i]>>r[i]; pr node={x[i]+r[i], i}; xr.insert(node); // r value changes and this need to be update } vector<double> ans(n); for (int i=0; i<n; i++){ if(i==0) { ans[i]=r[i]; continue; } // pr node={x[i]-r[i], i}; set<pr>::iterator it1=xr.lower_bound(node); // pos can only be less than or equal to i; node={x[i]+r[i], i}; set<pr>::iterator it2=xr.find(node); if(it1==it2) {ans[i]=r[i]; continue;} double lft=0; double rht=r[i]; while(rht-lft>0.00001){ double mid=lft+(rht-lft)/2; if(check(mid, it1, it2, i)) { rht=mid; } else lft=mid; } ans[i]=lft; xr.erase(node); node={x[i]+lft, i}; xr.insert(node); } cout << fixed <<setprecision(3); for (int i=0; i<n; i++) cout<<ans[i]<<endl; }
#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...