이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#define ll long long
using namespace std;
struct Bound {
double left;
double right;
bool validLeft;
bool validRight;
};
bool comp(Bound one, Bound two) {
return one.right < two.right;
}
bool comparator(Bound one, Bound two) {
return one.left < two.left;
}
bool check(double maxDist, vector<pair<double, double>> &transceivers, ll N, ll L) {
vector<Bound> bounds;
for (int i = 0; i < N; i++) {
double ySquared = transceivers[i].second * transceivers[i].second;
double hypoSquared = maxDist * maxDist;
if (hypoSquared - ySquared < 0) {
continue;
}
double x = sqrt(hypoSquared - ySquared);
Bound toAdd;
toAdd.left = max(transceivers[i].first - x, 0.0);
toAdd.right = min(transceivers[i].first + x, (double)L);
toAdd.validLeft = true;
toAdd.validRight = true;
if (x - transceivers[i].first > 0.0000001) {
toAdd.validLeft = false;
}
if (transceivers[i].first + x - (double)L > 0.0000001) {
toAdd.validRight = false;
}
bounds.push_back(toAdd);
}
sort(bounds.begin(), bounds.end(), comparator);
if (bounds.size() == 0 || bounds[0].validLeft || bounds[bounds.size() - 1].validRight) {
return true;
}
double right = bounds[0].right;
for (int i = 1; i < (int)bounds.size(); i++) {
if (bounds[i].left >= right && bounds[i].validLeft) {
return true;
}
right = max(bounds[i].right, right);
}
sort(bounds.begin(), bounds.end(), comp);
double front = bounds[bounds.size() - 1].left;
for (int i = (int)bounds.size() - 1; i >= 0; i--) {
if (bounds[i].right <= front && bounds[i].validRight) {
return true;
}
front = min(bounds[i].left, front);
}
return false;
}
int main() {
ll N, L;
cin >> N >> L;
vector<pair<double, double>> transceivers(N);
for (int i = 0; i < N; i++) cin >> transceivers[i].first >> transceivers[i].second;
double l = 0;
double r = 1e20;
double ans = 0;
while (r - l >= 0.0001) {
double mid = l + (r - l) / 2;
// cout << l << ' ' << r << ' ' << mid << '\n';
if (check(mid, transceivers, N, L)) {
l = mid;
ans = mid;
} else {
r = mid;
}
}
printf("%0.7lf\n", ans);
}
# | 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... |