제출 #1344473

#제출 시각아이디문제언어결과실행 시간메모리
1344473s3narasiAstronomer (BOI23_astronomer)C++20
0 / 100
22 ms452 KiB
#include <bits/stdc++.h>
using namespace std;

using ld = long double;
const ld PI = acosl(-1);

int k, n;
ld s, t;

vector<pair<ld, ld>> a;

ld dist(ld x, ld y) {
    return sqrtl(x*x + y*y);
}

bool check(ld cost) {
    // binary search on radius r
    ld lo = 0, hi = 2e9;

    for (int it = 0; it < 40; it++) {
        ld r = (lo + hi) / 2;

        ld D;
        if (s == 0) {
            D = 1e18; // no restriction on center
        } else {
            D = (cost - t * r) / s;
        }

        if (D < 0) {
            lo = r;
            continue;
        }

        vector<pair<ld,int>> ev;

        for (auto &[x, y] : a) {
            ld d = dist(x, y);

            if (d > r + D) continue;

            if (d < 1e-12) {
                // star at origin → contributes full circle
                ev.emplace_back(-PI, +1);
                ev.emplace_back(PI, -1);
                continue;
            }

            ld theta = atan2l(y, x);

            ld val = (d*d + D*D - r*r) / (2*d*D);
            if (val < -1) val = -1;
            if (val > 1) val = 1;

            ld alpha = acosl(val);

            ld L = theta - alpha;
            ld R = theta + alpha;

            // normalize into [-PI, PI]
            if (L < -PI) {
                ev.emplace_back(L + 2*PI, +1);
                ev.emplace_back(PI, -1);
                ev.emplace_back(-PI, +1);
                ev.emplace_back(R, -1);
            } else if (R > PI) {
                ev.emplace_back(L, +1);
                ev.emplace_back(PI, -1);
                ev.emplace_back(-PI, +1);
                ev.emplace_back(R - 2*PI, -1);
            } else {
                ev.emplace_back(L, +1);
                ev.emplace_back(R, -1);
            }
        }

        sort(ev.begin(), ev.end());

        int cur = 0, best = 0;
        for (auto &[ang, type] : ev) {
            cur += type;
            best = max(best, cur);
        }

        if (best >= k) {
            hi = r;
        } else {
            lo = r;
        }
    }

    // final check using best r = hi
    ld r = hi;

    ld D;
    if (s == 0) D = 1e18;
    else D = (cost - t * r) / s;

    if (D < 0) return false;

    vector<pair<ld,int>> ev;

    for (auto &[x, y] : a) {
        ld d = dist(x, y);

        if (d > r + D) continue;

        if (d < 1e-12) {
            ev.emplace_back(-PI, +1);
            ev.emplace_back(PI, -1);
            continue;
        }

        ld theta = atan2l(y, x);

        ld val = (d*d + D*D - r*r) / (2*d*D);
        val = max((ld)-1, min((ld)1, val));

        ld alpha = acosl(val);

        ld L = theta - alpha;
        ld R = theta + alpha;

        if (L < -PI) {
            ev.emplace_back(L + 2*PI, +1);
            ev.emplace_back(PI, -1);
            ev.emplace_back(-PI, +1);
            ev.emplace_back(R, -1);
        } else if (R > PI) {
            ev.emplace_back(L, +1);
            ev.emplace_back(PI, -1);
            ev.emplace_back(-PI, +1);
            ev.emplace_back(R - 2*PI, -1);
        } else {
            ev.emplace_back(L, +1);
            ev.emplace_back(R, -1);
        }
    }

    sort(ev.begin(), ev.end());

    int cur = 0;
    for (auto &[ang, type] : ev) {
        cur += type;
        if (cur >= k) return true;
    }

    return false;
}

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

    cin >> k >> n >> s >> t;

    a.resize(n);
    for (int i = 0; i < n; i++) {
        cin >> a[i].first >> a[i].second;
    }

    ld lo = 0, hi = 1e18;

    for (int it = 0; it < 60; it++) {
        ld mid = (lo + hi) / 2;
        if (check(mid)) hi = mid;
        else lo = mid;
    }

    cout << fixed << setprecision(10) << (double)hi << "\n";
}
#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...