Submission #1213541

#TimeUsernameProblemLanguageResultExecution timeMemory
1213541ULTRABIG7Mobile (BOI12_mobile)C++20
13 / 100
1099 ms97472 KiB
/*   
* Aqui temos uma intersecção de assuntos muito famosa: geometria e binary search
* A ideia é definir a função f(R) como sendo verdadeira se todos os pontos no segmento considerado
* são cobertos por pelo menos um círculo de raio R centrado em um dos sensores.

* Queremos o first_true disso, e vamos trabalhar com ponto flutuante então fiquem ligados
*/

#include <bits/stdc++.h>
using namespace std;

using ld = long double;
const ld INF = 1e18;

struct Point{
    ld x,y;
    Point(): x(0), y(0) {}

    Point(ld x, ld y): x(x), y(y) {}
};




ld first_true(ld lo, ld hi, function<bool(ld)> f) {
	ld ans = hi;
	while (hi - lo > 0.0000001) {
		ld mid = (0.5)*(lo + hi);

		if (f(mid)) {
            ans = mid;
			hi = mid - 0.0000001;
		} else {
			lo = mid + 0.0000001;
		}
	}
	return ans;
}

int main(){
    int n; cin >> n;
    ld L; cin >> L;

    vector<Point> sensores;
    for(int i = 0; i < n; i++){
        ld x, y; cin >> x >> y;

        sensores.push_back(Point(x,y));
    }

    // Intersecção com a reta y = 0. Retorna os pontos ou alguma forma de 
    // dizer que não tem intersecção

    auto intersect = [&](Point C, ld R){
        bool works = R >= abs(C.y);
        pair<ld, ld> ret = {0,0};

        if(!works){
            return make_pair(works, ret);
        }

        ld dist = sqrt(R*R - (C.y)*(C.y));

        ret.first = C.x - dist; 
        ret.second = C.x + dist;
        
        
        return make_pair(works, ret);
    };


    /*
    * Exemplo: (-5, 1), (1, -1), (2, 1), (11, -1)
    * badIntervals: [-INF, -5], [1, 2]
    * False
    */ 

    auto f = [&](ld R){
        vector<pair<ld,int>> events;
        vector<pair<ld,ld>> badIntervals;

        for(int i = 0; i < n; i++){
            auto tmp = intersect (sensores[i], R);

            if(!tmp.first){
                continue;
            }

            events.push_back({tmp.second.first, 1});
            events.push_back({tmp.second.second, -1});
        }

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

        // -INF, -2, 0, 1, 1, 10
        int cnt = 0;
        ld prev = -INF;

        for(auto [x, type] : events){
            if(cnt == 0){
                // Intervalo (prev, x) é paia

                if(0 <= prev && prev <= L){
                    return false;
                }

                if(0 <= x && x <= L){
                    return false;
                }
            }

            cnt += type;
            prev = x;
        }

        if(0 <= prev && prev <= L){
            return false;
        }


        return true;
    };


    cout << fixed << setprecision(6) << first_true (0, 1e18, f) << "\n";
    //cout << fixed << setprecision(4) << f(5.545455) << "\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...