제출 #1119509

#제출 시각아이디문제언어결과실행 시간메모리
1119509awesomemathsMobile (BOI12_mobile)C++17
0 / 100
455 ms89752 KiB
using namespace std;
#include <bits/stdc++.h>
#define ld long double
#define ll long long
#define MAXN 305
#define ALPHABETSIZE 26
#define ff first
#define ss second
#define pii pair<long double,long double>
#define vi vector<long double>
#define vii vector<pair<long double,long double>>

ld figure(ld x1, ld y1, ld x2, ld y2)
{
    ld mx = (x1 + x2)/2;
    ld my = (y1 + y2)/2;
    //my = m * (mx) + b
    ld m = (x1 - x2)/(y2 - y1);
    ld b = my - m * mx;
    //cout << m << " " << b << "\n";
    ld ans = -1 * b/m;
    return ans;
}
ld dist(ld x1, ld y1, ld x2, ld y2)
{
    return (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
}
int main()
{
    cout << fixed << setprecision(15);
    ios_base::sync_with_stdio(false); 
    cin.tie(NULL);
    ll n, l; cin >> n >> l;
    vector<pii> points(n);
    map<ld, ld> mp;
    for(int i = 0; i < n; i++){
        cin >> points[i].first >> points[i].second;
        points[i].second = abs(points[i].second);
    }
    stack<pair<ll, pair<ld, ld>>> s; 
    s.push({0, {0, l}});
    sort(points.begin(), points.end());
    for(int i = 1; i < n; i++){
        if(points[i].first == points[i - 1].first){
            continue;
        }
        ld curr = -1;
        if(points[i].second == points[i - 1].second){
            curr = (points[i].first + points[i - 1].first)/2;
        }
        else{
            curr = figure(points[i - 1].ff, points[i - 1].second, points[i].ff, points[i].ss);
        }
        while(s.size() && curr <= s.top().ss.ss){
            if(curr <= s.top().ss.ff){
                s.pop();
            }
            else{
                ld before = s.top().ss.ff;
                ll index = s.top().ff;
                s.pop();
                s.push({index, {before, curr}});
                s.push({i, {curr, l}});
                break;
            }
        }
    }
    ld res = 0;
    while(s.size()){
        auto get = s.top();
        s.pop();
        //cout << get.ff << " " << get.ss.ff << " " << get.ss.ss << "\n";
        res = max(res, dist(points[get.ff].first, points[get.ff].second, get.ss.ff,0));
        res = max(res, dist(points[get.ff].first, points[get.ff].second, get.ss.ss,0));
    }
    res = sqrt(res);
    cout << res << "\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...
#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...