Submission #1289900

#TimeUsernameProblemLanguageResultExecution timeMemory
1289900becastalBalloons (CEOI11_bal)C++20
10 / 100
716 ms5508 KiB
#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 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...