QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#468023#7846. Glacier TravellonelywolfAC ✓16ms4228kbC++202.9kb2024-07-08 18:45:262024-07-08 18:45:26

Judging History

你现在查看的是最新测评结果

  • [2024-07-08 18:45:26]
  • 评测
  • 测评结果:AC
  • 用时:16ms
  • 内存:4228kb
  • [2024-07-08 18:45:26]
  • 提交

answer

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

#define int long long

using db = double;
const db eps = 1e-9;

int sgn(db k) {
    if (k > eps) {
        return 1;
    }
    if (k < -eps) {
        return -1;
    }
    return 0;
}
int cmp(db a, db b) {
    return sgn(a - b);
}
struct point {
    db x, y;
    point operator + (const point &k) {
        return {x + k.x, y + k.y};
    }
    point operator - (const point &k) {
        return {x - k.x, y - k.y};
    }
    point operator * (const db &k) {
        return {x * k, y * k};
    }
    point operator / (const db &k) {
        return {x / k, y / k};
    }
    
    friend istream &operator >> (istream &is, point &p) {
        return is >> p.x >> p.y;
    }
    friend ostream &operator << (ostream &os, point &p) {
        return os << p.x << " " << p.y;
    }

    db len2() {
        return x * x + y * y;
    }
    db len() {
        return sqrt(len2());
    }
    point unit() {
        return (*this) / len();
    }
};
db dis(point p1, point p2) {
    return sqrt((p1 - p2).len2());
}
signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout << fixed << setprecision(10);
    db d;
    cin >> d;
    int n;
    cin >> n;
    vector<db> s(n + 1);
    vector<point> p(n + 1);
    for (int i = 1; i <= n; i++) {
        cin >> p[i];
    }
    for (int i = 2; i <= n; i++) {
        s[i] = s[i - 1] + dis(p[i - 1], p[i]);
    }
    vector<db> tim;
    for (int i = 1; i <= n; i++) {
        tim.push_back(s[i]);
        tim.push_back(s[i] + d);
    }
    auto find = [&] (db t) {
        int l = 0, r = n;
        while (l + 1 != r) {
            int m = (l + r) / 2;
            if (cmp(s[m], t) <= 0) {
                l = m;
            } else {
                r = m;
            }
        }
        point v = (p[l + 1] - p[l]).unit();
        point ret = p[l] + v * (t - s[l]);
        return make_pair(ret, v);
    };
    sort(tim.begin(), tim.end());
    db ans = 1e18;
    for (int i = 1; i < tim.size(); i++) {
        db t1 = tim[i - 1], t2 = tim[i];
        if (cmp(t1, t2) == 0 || cmp(t1, s[n]) == 1 || cmp(t2, s[n]) == 1 || cmp(t1, d) == -1 || cmp(t2, d) == -1) {
            continue;
        }
        // cerr << t1 << " " << t2 << "\n";
        auto [p1, v1] = find(t1 - d);
        auto [p2, v2] = find(t1);
        db l = 0, r = t2 - t1;
        auto calc = [&] (db t) {
            point a = p1 + v1 * t;
            point b = p2 + v2 * t;
            return dis(a, b);
        };
        while (r - l > 1e-9) {
            db lm = (2 * l + r) / 3;
            db rm = (2 * r + l) / 3;
            if (calc(lm) > calc(rm)) {
                l = lm;
            } else {
                r = rm;
            }
        }
        ans = min(ans, calc(l));
        ans = min(ans, calc(r));
    }
    cout << ans << "\n";
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3772kb

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: 3896kb

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: 3940kb

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: 0ms
memory: 3840kb

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.0000000007

result:

ok found '0.00000', expected '0.00000', error '0.00000'

Test #5:

score: 0
Accepted
time: 1ms
memory: 3880kb

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: 16ms
memory: 4228kb

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: 15ms
memory: 3996kb

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: 3840kb

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.0000000003

result:

ok found '0.00000', expected '0.00000', error '0.00000'