Submission #1213537

#TimeUsernameProblemLanguageResultExecution timeMemory
1213537ULTRABIG7Mobile (BOI12_mobile)C++20
13 / 100
1096 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, 1e9, 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...