제출 #1163630

#제출 시각아이디문제언어결과실행 시간메모리
1163630kedimestanMobile (BOI12_mobile)C++20
0 / 100
1096 ms15944 KiB
#include <bits/stdc++.h>
using namespace std;

struct Station {
    long long x, y;
};

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int N;
    long long L;
    cin >> N >> L;
    vector<Station> stations(N);
    for (int i = 0; i < N; i++) {
        cin >> stations[i].x >> stations[i].y;
    }

    // Function to compute the distance from a highway point x to its nearest BTS
    auto nearestDistance = [&](double x) -> double {
        // Binary search for the first station with x-coordinate >= x
        int lo = 0, hi = N;
        while (lo < hi) {
            int mid = lo + (hi - lo) / 2;
            if (stations[mid].x < x)
                lo = mid + 1;
            else
                hi = mid;
        }

        double best = 1e18;
        // Check station at or after x
        if (lo < N) {
            double dx = x - stations[lo].x;
            double dist = sqrt(dx * dx + (double)stations[lo].y * stations[lo].y);
            best = min(best, dist);
        }
        // Check station immediately before x (if exists)
        if (lo - 1 >= 0) {
            double dx = x - stations[lo - 1].x;
            double dist = sqrt(dx * dx + (double)stations[lo - 1].y * stations[lo - 1].y);
            best = min(best, dist);
        }
        return best;
    };
    
    // Binary search on the highway [0, L] for the maximum distance
    double left = 0.0, right = (double)L;
    double maxDist = 0.0;
    const double eps = 1e-9;  // Increased precision

    while (right - left > eps) {
        double mid = (left + right) / 2.0;
        double dMid = nearestDistance(mid);
        double dMidEps = nearestDistance(mid + eps);

        maxDist = max(maxDist, dMid);

        // Compare the distances at mid and mid + eps to determine the direction
        if (dMid < dMidEps) {
            left = mid;  // move right if function is increasing
        } else {
            right = mid; // move left if function is decreasing
        }
    }

    cout << fixed << setprecision(6) << maxDist << "\n";
    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...
#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...