QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#468148 | #7846. Glacier Travel | lonelywolf | AC ✓ | 13ms | 4284kb | C++23 | 3.1kb | 2024-07-08 19:33:22 | 2024-07-08 19:33:22 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
using db = double;
constexpr db eps = 1e-6;
int cmp(db a, db b) {
if (a - b > eps) {
return 1;
}
if (a - b < -eps) {
return -1;
}
return 0;
}
struct Point {
db x, y;
Point operator+(const Point& a) {
return {x + a.x, y + a.y};
}
Point operator-(const Point& a) {
return {x - a.x, y - a.y};
}
Point operator*(const db& a) {
return {x * a, y * a};
}
Point operator/(const db& a) {
return {x / a, y / a};
}
db len2() {
return x * x + y * y;
}
db len() {
return sqrt(len2());
}
Point unit() {
return (*this) / len();
}
};
db dis(Point a, Point b) {
return (b - a).len();
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout << fixed << setprecision(10);
db s;
int n;
cin >> s >> n;
vector<Point> A(n);
for (auto &[x, y] : A) {
cin >> x >> y;
}
vector<db> sum(n);
vector<db> tim;
for (int i = 0; i < n - 1; i++) {
sum[i + 1] = sum[i] + dis(A[i], A[i + 1]);
}
for (int i = 0; i < n; i++) {
if (cmp(sum[i] + s, sum[n - 1]) <= 0) {
tim.push_back(sum[i]);
}
if (cmp(sum[i], s) >= 0) {
tim.push_back(sum[i] - s);
}
}
sort(tim.begin(), tim.end());
Point dir1, dir2;
int i1 = 0, i2 = 0;
db ans = 1e18;
for (int i = 0; i < tim.size() - 1; i++) {
db t1 = tim[i], t2 = tim[i + 1];
if (cmp(t1, t2) == 0) {
continue;
}
int l = -1, r = n;
while (l + 1 != r) {
int m = (l + r) / 2;
if (cmp(sum[m], t1) <= 0) {
l = m;
} else {
r = m;
}
}
i1 = l;
l = -1, r = n;
while (l + 1 != r) {
int m = (l + r) / 2;
if (cmp(sum[m], t1 + s) <= 0) {
l = m;
} else {
r = m;
}
}
i2 = l;
// while (i1 + 1 < n && cmp(sum[i1 + 1], t1) <= 0) {
// i1++;
// }
// while (i2 + 1 < n && cmp(sum[i2 + 1], t1 + s) <= 0) {
// i2++;
// }
Point v1 = (A[i1 + 1] - A[i1]).unit();
Point v2 = (A[i2 + 1] - A[i2]).unit();
Point p1 = A[i1] + v1 * (t1 - sum[i1]);
Point p2 = A[i2] + v2 * (t1 + s - sum[i2]);
auto calc = [&](db t) {
return dis(p1 + v1 * t, p2 + v2 * t);
};
db lo = 0, hi = t2 - t1;
while (hi - lo > eps) {
// cerr << lo << " " << hi << "\n";
db lm = (2 * lo + hi) / 3;
db rm = (lo + 2 * hi) / 3;
if (calc(lm) > calc(rm)) {
lo = lm;
} else {
hi = rm;
}
}
// dir1 = (A[i1 + 1] - A[i1]).unit();
// dir2 = (A[i2 + 1] - A[i2]).unit();
// auto calc = [&](db t) {
// Point a = A[i1] + dir1 * (t - sum[i1]);
// Point b = A[i2] + dir2 * (t + s - sum[i2]);
// return dis(a, b);
// };
// while (t2 - t1 > eps) {
// db lm = (2 * t1 + t2) / 3;
// db rm = (t1 + 2 * t2) / 3;
// if (calc(lm) > calc(rm)) {
// t1 = lm;
// } else {
// t2 = rm;
// }
// }
ans = min(ans, calc(lo));
}
cout << ans << "\n";
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3912kb
input:
5 4 20 0 10 0 10 10 0 10
output:
3.5355339059
result:
ok found '3.53553', expected '3.53553', error '0.00000'
Test #2:
score: 0
Accepted
time: 0ms
memory: 4060kb
input:
3.16227766 9 -2 4 2 4 3 1 4 4 5 1 6 4 10 2 6 1 7 4
output:
0.9999999999
result:
ok found '1.00000', expected '1.00000', error '0.00000'
Test #3:
score: 0
Accepted
time: 0ms
memory: 3760kb
input:
20 5 9 38 36 16 -5 36 -24 15 30 37
output:
2.2935957604
result:
ok found '2.29360', expected '2.29360', error '0.00000'
Test #4:
score: 0
Accepted
time: 1ms
memory: 4048kb
input:
10 40 17 18 12 -5 12 -16 -10 16 7 -15 18 -18 19 15 -19 1 -18 11 -8 -12 -17 -12 5 -12 -15 -8 -10 -10 -4 4 -2 -3 15 17 -2 -9 -13 7 -12 17 15 -3 -19 -14 6 6 14 -5 -10 -15 17 -16 -11 15 9 -6 10 8 19 -1 12 -6 -18 2 14 17 9 -7 -8 -3 7 11 -12 -14 -19 4 -1 15 -17 16
output:
0.0000008485
result:
ok found '0.00000', expected '0.00000', error '0.00000'
Test #5:
score: 0
Accepted
time: 0ms
memory: 3984kb
input:
10 40 10 11 11 15 6 -16 -18 4 10 10 -10 16 -17 11 2 6 -6 -9 17 -7 -7 -5 10 -18 -9 9 -14 10 19 -3 -14 -3 15 -5 -3 16 -10 14 -9 -12 10 -18 10 -4 -9 -11 11 -2 9 2 12 15 2 -17 -8 -16 19 7 -19 -2 -17 7 16 -9 6 -6 8 -18 15 9 17 2 -19 12 -15 -9 1 -15 19 -12
output:
0.3442144373
result:
ok found '0.34421', expected '0.34421', error '0.00000'
Test #6:
score: 0
Accepted
time: 13ms
memory: 4044kb
input:
1000 4000 -720538 -681604 667325 347504 -911397 -962007 -264075 -858319 49605 149209 964851 361021 -397274 28661 -460607 -273701 104862 -136807 -803899 -693703 -974 -337735 323678 -209811 -745617 -358684 -984333 603546 722843 -444579 701511 -255784 -676477 -836480 998942 -227888 -502059 -438394 9641...
output:
0.0445047435
result:
ok found '0.04450', expected '0.04450', error '0.00000'
Test #7:
score: 0
Accepted
time: 12ms
memory: 4284kb
input:
1000 4000 703 909 500 496 -214 628 914 -44 -330 -238 -1424 -1426 347 1420 332 -1417 877 1678 -1390 819 -921 525 121 -923 -851 -859 512 -151 765 -109 416 -1529 -269 667 475 -234 -708 300 1917 -1935 -909 1342 1141 -696 -272 1295 1908 -1124 -898 -1225 1608 630 -1937 1246 -255 1021 -1005 -1650 -1595 -39...
output:
0.0381857100
result:
ok found '0.03819', expected '0.03819', error '0.00000'
Test #8:
score: 0
Accepted
time: 0ms
memory: 3764kb
input:
40 3 100 0 0 100 0 0
output:
15.3073372946
result:
ok found '15.30734', expected '15.30734', error '0.00000'
Test #9:
score: 0
Accepted
time: 0ms
memory: 3876kb
input:
48.2842712475 4 -10 -10 10 10 -10 10 10 -10
output:
0.0000007254
result:
ok found '0.00000', expected '0.00000', error '0.00000'