QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#807039#7846. Glacier TravelSGColinAC ✓3ms6160kbC++202.4kb2024-12-09 18:28:512024-12-09 18:28:51

Judging History

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

  • [2024-12-09 18:28:51]
  • 评测
  • 测评结果:AC
  • 用时:3ms
  • 内存:6160kb
  • [2024-12-09 18:28:51]
  • 提交

answer

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

#define eb emplace_back
#define all(s) (s).begin(), (s).end()
#define rep(i, a, b) for (int i = (a); i <= (b); ++i)
#define per(i, a, b) for (int i = (a); i >= (b); --i)

#define N 1000007

struct P {
    double x, y;
    P operator + (const P &p) const {return {x + p.x, y + p.y};}
    P operator - (const P &p) const {return {x - p.x, y - p.y};}
    P operator * (const double &d) const {return {x * d, y * d};}
    P operator / (const double &d) const {return {x / d, y / d};}
} p[N], u[N];

double abs(const P &p) {return sqrt(p.x * p.x + p.y * p.y);}

int main() {
    cin.tie(0);
    ios::sync_with_stdio(false);
    double s; cin >> s;
    int n; cin >> n;
    rep(i, 1, n) {
        cin >> p[i].x >> p[i].y;
        u[i] = (p[i] - p[i - 1]) / abs(p[i] - p[i - 1]);
    }
    double ans = s;
    int tara = 2, tarb = 2;
    P posa = p[1], posb = p[1];
    for (double d = 0; tarb <= n && d < s; ) {
        double _d = abs(posb - p[tarb]);
        if (d + _d >= s) {
            posb = posb + u[tarb] * (s - d);
            break;
        } else {posb = p[tarb++]; d += _d;}
    }
    ans = min(ans, abs(posa - posb));
    auto calc = [&](const P &p1, const P &p2, const P &q1, const P &q2) {
        double l = 0, r = 1;
        auto getd = [&](double ra) {
            P pp = p1 * ra + p2 * (1 - ra);
            P qq = q1 * ra + q2 * (1 - ra);
            return abs(pp - qq);
        };
        rep(i, 1, 30) {
            double lmid = l + (r - l) / 3;
            double rmid = r - (r - l) / 3;
            double ansl = getd(lmid), ansr = getd(rmid);
            ans = min({ans, ansl, ansr});
            ansl < ansr ? r = rmid : l = lmid;
        }
    };
    while (tarb <= n) {
        if (tara == tarb) {
            posa = p[tara] - u[tara] * s;
            posb = p[tarb++];
        }
        if (tarb > n) break;
        double d1 = abs(posa - p[tara]);
        double d2 = abs(posb - p[tarb]);
        if (d1 < d2) {
            P _posb = posb + u[tarb] * d1;
            calc(posa, p[tara], posb, _posb);
            posa = p[tara++]; posb = _posb;
        } else {
            P _posa = posa + u[tara] * d2;
            calc(posa, _posa, posb, p[tarb]);
            posa = _posa; posb = p[tarb++];
        }
    }
    printf("%.10lf\n", ans);
    return 0;
}

详细

Test #1:

score: 100
Accepted
time: 1ms
memory: 5912kb

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

input:

3.16227766
9
-2 4
2 4
3 1
4 4
5 1
6 4
10 2
6 1
7 4

output:

1.0000000000

result:

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

Test #3:

score: 0
Accepted
time: 0ms
memory: 5928kb

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

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

result:

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

Test #5:

score: 0
Accepted
time: 0ms
memory: 6044kb

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

result:

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

Test #6:

score: 0
Accepted
time: 3ms
memory: 5968kb

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

result:

ok found '0.04451', expected '0.04450', error '0.00001'

Test #7:

score: 0
Accepted
time: 3ms
memory: 6160kb

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

result:

ok found '0.03820', expected '0.03819', error '0.00001'

Test #8:

score: 0
Accepted
time: 0ms
memory: 6040kb

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: 1ms
memory: 6032kb

input:

48.2842712475
4
-10 -10
10 10
-10 10
10 -10

output:

0.0000179422

result:

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