Submission #1056811

#TimeUsernameProblemLanguageResultExecution timeMemory
1056811TimAniMobile (BOI12_mobile)C++17
0 / 100
1084 ms39764 KiB
// time-limit: 3000 #include <bits/stdc++.h> using namespace std; using ll = long long; struct point { int x{}, y{}; }; void solve() { int n, L; cin >> n >> L; vector<point> p(n); for(int i = 0; i < n; i++) { cin >> p[i].x >> p[i].y; } auto intersection = [&](const point& A, long double R) -> array<long double, 2> { // y^2 = 0, // y^2 = R^2 - (x - A.x)^2 + 2yA.y - A.y ^ 2; // R^2 - (x - A.x) ^ 2 - A.y^2 = 0 // R^2 - x^2 + 2xA.x - A.x^2 - A.y^2 = 0 // x^2 - 2xA.x + A.x^2 + A.y^2 - R^2 = 0 // D = -4A.y^2 + 4R^2 if(abs(A.y) > R) { return {L + 1, -1}; } long double D = 4 * (R * R - A.y * A.y); long double x1 = (2 * A.x - sqrt(D)) / 2; long double x2 = (2 * A.x + sqrt(D)) / 2; if(x1 < 0) x1 = 0; if(x2 > L) x2 = L; return {x1, x2}; }; auto good = [&](long double R) { vector<array<long double, 2>> segs(n); for(int i = 0; i < n; i++) { segs[i] = intersection(p[i], R); } sort(segs.begin(), segs.end()); long double l = segs[0][0], r = segs[0][1]; int i = 0; while(i + 1 < n && segs[i + 1][0] <= r) { r = max(segs[i + 1][1], r); i++; } return r >= L and l <= 0; }; long double l = 0, r = hypot(2e9, 1e9); for(int i = 0; i < 100; i++) { long double R = (r + l) / 2; if(good(R)) { r = R; } else { l = R; } } cout << fixed << setprecision(6) << r << endl; } int main() { cin.tie(0)->sync_with_stdio(0); int T = 1; //cin >> T; while(T--) solve(); return 0; }

Compilation message (stderr)

mobile.cpp: In lambda function:
mobile.cpp:26:23: warning: narrowing conversion of '(L + 1)' from 'int' to 'long double' [-Wnarrowing]
   26 |             return {L + 1, -1};
      |                     ~~^~~
mobile.cpp:31:9: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
   31 |         if(x1 < 0) x1 = 0; if(x2 > L) x2 = L;
      |         ^~
mobile.cpp:31:28: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
   31 |         if(x1 < 0) x1 = 0; if(x2 > L) x2 = L;
      |                            ^~
#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...
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...