Submission #1354703

#TimeUsernameProblemLanguageResultExecution timeMemory
1354703marcus06Mobile (BOI12_mobile)C++20
0 / 100
617 ms12184 KiB
#include <bits/stdc++.h>
using namespace std;
using lli = long long;

void solve() {
    int N, L;
    cin >> N >> L;
    vector <int> x(N), y(N);
    for (int i = 0; i < N; ++i) {
        cin >> x[i] >> y[i];
    }

    vector <int> ord(N);
    iota(ord.begin(), ord.end(), 0);
    sort(ord.begin(), ord.end(), [&](int i, int j) {
        return x[i] < x[j];
    });

    auto possible = [&](double d) -> bool {
        vector <pair <double, double>> range;
        for (int i: ord) {
            if (y[i] >= d) return true;
            double p = y[i];
            double delta = sqrt(d * d - p * p);

            double l = (double) x[i] - delta, r = (double) x[i] + delta;
            while (!range.empty() && range.back().second >= l) {
                l = min(l, range.back().first);
                r = max(r, range.back().second);
                range.pop_back();
            }
            range.emplace_back(l, r);
        }
        for (auto [x, y]: range) {
            if (x <= 0 && y >= L) return false;
        }
        return true;
    };

    double l = 0, r = L;
    for (int iter = 0; iter < 64; ++iter) {
        double mid = (l + r) / 2; //check if there exist a point which distance >= mid
        if (possible(mid))
            l = mid;
        else
            r = mid;
    }
    cout << setprecision(20) << fixed;
    cout << l << '\n';
}

int main() {
    std::cin.tie(0)->sync_with_stdio(0);
#ifdef LOCAL
    auto begin = std::chrono::high_resolution_clock::now();
#endif

    int tt = 1;
    while (tt--) {
        solve();
    }

#ifdef LOCAL
    auto end = std::chrono::high_resolution_clock::now();
    auto elapsed = std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin);
    std::cerr << "Time measured: " << elapsed.count() * 1e-9 << " seconds.\n";
#endif
    return 0;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...