Submission #1267169

#TimeUsernameProblemLanguageResultExecution timeMemory
1267169goppamachMobile (BOI12_mobile)C++20
13 / 100
1097 ms48176 KiB
// #pragma GCC optimize("Ofast")

#include <bits/stdc++.h>

using namespace std;

#define el "\n"
#define pii pair<int, int>
#define pll pair<ll, ll>
#define fi first
#define se second
#define sqr(x) ((x) * (x))
#define FOR(i, l, r) for (int i = l; i <= (r); i++)
#define FOD(i, l, r) for (int i = l; i >= (r); i--)
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define sz(x) ((int)(x).size())
#define fast_io ios_base::sync_with_stdio(false); cin.tie(nullptr);

using db = long double;
using ll = long long;
using ull = unsigned long long;
using vi = vector<int>;
using vll = vector<ll>;
using vpii = vector<pii>;
using vpll = vector<pll>;
using vvi = vector<vi>;
using vvll = vector<vll>;
using vbool = vector<bool>;
using vvbool = vector<vbool>;

template<class T> inline bool chmax(T &a, T const &b) { return (a < b ? (a = b, true) : false); }
template<class T> inline bool chmin(T &a, T const &b) { return (a > b ? (a = b, true) : false); }

// #define DEBUG
#ifdef DEBUG
#include "D:\cpp\debug.h"
#else
#define debug(...)
#define debug_arr(...)
#endif

mt19937 rng((uint32_t)chrono::steady_clock::now().time_since_epoch().count());

constexpr int N = 1E6 + 5;
constexpr double MAX = 2E9;
constexpr double EPS = 1E-6;
constexpr int PRECISION = 6;

struct Point {
    ll x, y;
    Point() = default;
    Point(ll x, ll y): x(x), y(y) {}
};

Point points[N];
int n, L;

bool check(double r) {
    vector<pair<double, double>> intervals;
    FOR(i, 1, n) {
        if (r < abs(points[i].y)) continue;
        double delta = sqrt(sqr(r) - sqr(points[i].y));
        intervals.emplace_back(points[i].x - delta, points[i].x + delta);
    }
    sort(all(intervals)); // sort segments by their left endpoint

    pair<double, double> merged = {0, 0};
    bool started = false;
    for (auto const &iv : intervals) {
        if (!started) {
            merged = iv;
            started = true;
        } else if (merged.se < iv.fi) { // there are disjoint intervals
            return false;
        } else {
            chmax(merged.se, iv.se);
        }
    }

    return merged.fi <= 0 && merged.se >= L;
}

void solve() {
    cin >> n >> L;

    FOR(i, 1, n) {
        ll x, y;
        cin >> x >> y;
        points[i] = {x, y};
    }

    double l = 0, r = MAX, res = MAX;
    while (r - l > EPS) {
        double m = (l + r) / 2;
        if (check(m)) {
            res = m;
            r = m;
        } else {
            l = m;
        }
    }

    cout << fixed << setprecision(PRECISION) << res << el;
}

int main() {
    fast_io
    #define LOCAL
    #ifndef LOCAL
    #define PROBLEM ""
    freopen(PROBLEM ".INP", "r", stdin);
    freopen(PROBLEM ".OUT", "w", stdout);
    #endif

    int t = 1;
    // cin >> t;
    while (t--) solve();
}
#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...