제출 #1309762

#제출 시각아이디문제언어결과실행 시간메모리
1309762tin_leMobile (BOI12_mobile)C++20
0 / 100
137 ms32972 KiB
#include<bits/stdc++.h>
#if defined(LOCAL) && __has_include("debug.h")
#include "debug.h"
#else
#define debug(...)
#endif
using i64 = long long;
using u64 = unsigned long long;
using i128 = __int128;
using ld = long double;

struct Line {
    i64 m, b;
    ld X;
    ld eval(ld x) const { return (ld)m * x + (ld)b; }
};

struct MonoCHT {
    std::deque<Line> dq;
    MonoCHT() {}

    static bool bad(const Line &L1, const Line &L2, const Line &L3) {
        i128 left  = (i128)(L2.b - L1.b) * (i128)(L2.m - L3.m);
        i128 right = (i128)(L3.b - L2.b) * (i128)(L1.m - L2.m);
        return left >= right;
    }

    static ld isectX(const Line& A, const Line& B) {
        return (ld)(B.b - A.b) / (ld)(A.m - B.m);
    }

    void add(Line L) {
        if(!dq.empty() && dq.back().m == L.m) {
            if(dq.back().b >= L.b) return;
            dq.pop_back();
        }
        while(dq.size() >= 2 && bad(dq[dq.size() - 2], dq[dq.size() - 1], L)) dq.pop_back();
        L.X = dq.empty() ? (ld)-1e300L : isectX(dq.back(), L);
        while(!dq.empty() && L.X <= dq.back().X) {
            dq.pop_back();
            while(dq.size() >= 2 && bad(dq[dq.size() - 2], dq[dq.size() - 1], L)) dq.pop_back();
            L.X = dq.empty() ? (ld)-1e300L : isectX(dq.back(), L);
        }
        dq.push_back(L);
    }
};

void solve() {
    // (x - xi)^2 + yi^2
    // x^2 + min((- 2xix + xi^2 + yi^2))
    int n, L;
    std::cin >> n >> L;
    MonoCHT cht;
    for(int i = 0; i < n; i++) {
        i64 x, y;
        std::cin >> x >> y;
        cht.add(Line(2 * x, -x * x - y * y, -1e300L));
    }
    const auto& q = cht.dq;
    ld res = 0;
    for(int i = 0; i < int(q.size()); i++) {
        auto f = [&](ld x) -> ld {
            return x * x - q[i].eval(x);
        };
        res = std::max(res, f(std::fmax(0.0, std::fmin(L, q[i].X))));
        if(i + 1 < int(q.size())) {
            res = std::max(res, f(std::fmax(0.0, std::fmin(L, q[i + 1].X))));
        }
    }
    std::cout << std::fixed << std::setprecision(6) << sqrtl(res) << '\n';
}

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    
    int t = 1;
    //std::cin >> t;
    while(t--) {
        solve();
    }
    
    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...