/*
* 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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |