QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#587147#5054. City BrainhcywoiWA 1579ms101328kbC++233.3kb2024-09-24 17:47:202024-09-24 17:47:21

Judging History

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

  • [2024-09-24 17:47:21]
  • 评测
  • 测评结果:WA
  • 用时:1579ms
  • 内存:101328kb
  • [2024-09-24 17:47:20]
  • 提交

answer

#include <bits/stdc++.h>

using i64 = long long;

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);

    int n, m, k;
    std::cin >> n >> m >> k;

    std::vector<std::vector<int>> adj(n);
    for (int i = 0; i < m; i ++ ) {
        int u, v;
        std::cin >> u >> v;
        u --, v -- ;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }

    int s1, t1, s2, t2;
    std::cin >> s1 >> t1 >> s2 >> t2;
    s1 --, t1 --, s2 --, t2 -- ;

    std::vector dis(n, std::vector<int>(n, 1E9));
    for (int i = 0; i < n; i ++ ) {
        std::queue<int> q;
        q.push(i);
        dis[i][i] = 0;
        while (!q.empty()) {
            int x = q.front();
            q.pop();
            for (auto y : adj[x]) {
                if (dis[i][y] > dis[i][x] + 1) {
                    dis[i][y] = dis[i][x] + 1;
                    q.push(y);
                }
            }
        }
    }

    long double ans;

    int d0 = dis[s1][t1], d1 = dis[s2][t2];
    if (d0 + d1 == 0) {
        ans = 0;
    } else {
        int t = k / (d0 + d1);
        int rmain = k % (d0 + d1);
        ans = 1. / (t + 1) * (d0 + d1 - rmain) + 1. / (t + 2) * rmain;
    }

    for (int s = 0; s < n; s ++ ) {
        for (int t = s + 1; t < n; t ++ ) {
            int both = dis[s][t];
            int dis1 = std::min(dis[s1][s] + dis[t][t1], dis[s1][t] + dis[s][t1]);
            int dis2 = std::min(dis[s2][s] + dis[t][t2], dis[s2][t] + dis[s][t2]);
            if (both > n || dis1 + dis2 > n) {
                continue;
            }

            auto f = [&](int x) -> long double {
                if (1LL * x * both > k) {
                    return 1E9;
                }
                int nk = k;
                long double res = 2. / (x + 1) * both;
                nk -= x * both;
                if (dis1 + dis2 > 0) {
                    int t = nk / (dis1 + dis2);
                    res += 1. / (t + 1) * (dis1 + dis2);
                    nk -= t * (dis1 + dis2);
                    if (nk > 0) {
                        if (std::min(both - 1, nk) * 2. / (x + 1) / (x + 2) > nk * 1. / (t + 1) / (t + 2)) {
                            res -= std::min(both - 1, nk) * 2. / (x + 1) / (x + 2);
                        } else {
                            res -= nk * 1. / (t + 1) / (t + 2);
                        }
                    }
                } else {
                    res -= std::min(both - 1, nk) * 2. / (x + 1) / (x + 2);
                }
                return res;
            };

            if (k == 149) {
                for (int i = 0; i <= k; i ++ ) {
                    ans = std::min(ans, f(i));
                }
            }
            int lo = 0, hi = k;
            while (lo < hi) {
                int m = (lo + hi) / 2;
                int l = lo + m, r = hi - m;
                if (f(l) > f(r)) {
                    ans = std::min(ans, f(r));
                    lo = l + 1;
                } else {
                    ans = std::min(ans, f(l));
                    hi = r - 1;
                }
            }
            ans = std::min(ans, f(hi));
        }
    }
    std::cout << std::fixed << std::setprecision(9) << ans << "\n";

    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

input:

6 5 1
1 2
3 2
2 4
4 5
4 6
1 5 3 6

output:

5.000000000

result:

ok found '5.000000000', expected '5.000000000', error '0.000000000'

Test #2:

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

input:

1 0 100
1 1 1 1

output:

0.000000000

result:

ok found '0.000000000', expected '0.000000000', error '-0.000000000'

Test #3:

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

input:

4 2 3
1 2
3 4
1 2 3 4

output:

0.833333333

result:

ok found '0.833333333', expected '0.833333333', error '0.000000000'

Test #4:

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

input:

6 5 1
1 2
3 2
2 4
4 5
4 6
1 5 6 3

output:

5.000000000

result:

ok found '5.000000000', expected '5.000000000', error '0.000000000'

Test #5:

score: 0
Accepted
time: 1099ms
memory: 101264kb

input:

5000 4999 1000000000
1 2
1 3
1 4
1 5
6 2
7 3
8 4
9 5
10 6
11 7
12 8
13 9
14 10
15 11
16 12
17 13
18 14
19 15
20 16
21 17
22 18
23 19
24 20
25 21
26 22
27 23
28 24
29 25
30 26
31 27
32 28
33 29
34 30
35 31
36 32
37 33
38 34
39 35
40 36
41 37
42 38
43 39
44 40
45 41
46 42
47 43
48 44
49 45
50 46
51 47...

output:

0.024989876

result:

ok found '0.024989876', expected '0.024989876', error '0.000000000'

Test #6:

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

input:

10 9 305097549
2 1
8 9
6 7
5 4
8 7
4 3
2 3
9 10
6 5
4 3 2 1

output:

0.000000013

result:

ok found '0.000000013', expected '0.000000013', error '0.000000000'

Test #7:

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

input:

10 9 9
4 2
3 6
8 6
2 1
7 9
5 2
2 3
10 9
7 4
8 7 9 5

output:

3.833333333

result:

ok found '3.833333333', expected '3.833333333', error '0.000000000'

Test #8:

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

input:

10 9 19
5 2
4 1
2 1
6 5
10 8
8 1
9 3
7 6
1 3
7 7 6 4

output:

0.700000000

result:

ok found '0.700000000', expected '0.700000000', error '0.000000000'

Test #9:

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

input:

100 99 149
82 77
11 14
99 94
29 24
41 31
52 57
64 73
42 32
85 84
88 86
54 59
75 66
38 28
92 90
9 19
60 61
24 19
24 31
21 18
38 47
67 74
79 89
64 66
34 29
23 16
87 83
11 16
2 4
10 11
76 77
36 32
18 22
71 72
79 77
97 96
47 48
43 34
63 55
51 45
91 94
3 1
31 39
41 44
51 58
6 10
48 54
74 76
7 15
18 13
32...

output:

1.805982906

result:

ok found '1.805982906', expected '1.805982906', error '0.000000000'

Test #10:

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

input:

100 99 126
23 98
27 75
2 7
81 83
10 13
99 3
10 7
70 56
28 16
3 15
18 16
51 55
1 33
6 3
53 61
3 1
68 76
68 85
26 79
40 86
28 37
25 16
12 14
23 48
22 3
66 96
16 39
41 90
69 100
97 89
37 84
51 37
32 25
36 14
35 21
67 20
7 27
23 31
4 23
32 34
44 1
66 23
95 70
42 73
26 7
19 38
93 58
39 88
2 65
1 12
81 2
...

output:

0.272727273

result:

ok found '0.272727273', expected '0.272727273', error '0.000000000'

Test #11:

score: 0
Accepted
time: 875ms
memory: 101276kb

input:

5000 4999 7363
4100 4099
2570 2569
494 493
608 609
3424 3423
1771 1770
4935 4934
1536 1537
2704 2703
2429 2428
4048 4049
2708 2709
3982 3981
1866 1867
1779 1780
1491 1490
3719 3720
3960 3959
1515 1516
2157 2158
3798 3799
4624 4625
2626 2627
4882 4883
2769 2770
4999 4998
514 513
3236 3237
3424 3425
2...

output:

365.900000000

result:

ok found '365.900000000', expected '365.900000000', error '0.000000000'

Test #12:

score: -100
Wrong Answer
time: 1579ms
memory: 101328kb

input:

5000 4999 1713
4590 4518
4868 4954
2977 2986
2091 2190
458 540
1668 1738
2670 2760
371 441
4778 4800
4282 4347
534 557
1560 1498
2444 2430
4602 4520
1361 1457
4934 4918
963 984
2305 2274
798 842
4150 4174
1102 1038
1264 1234
115 175
4994 4901
3375 3459
530 468
1517 1480
1080 1150
4637 4568
2456 2414...

output:

6.629765795

result:

wrong answer 1st numbers differ - expected: '6.6261189', found: '6.6297658', error = '0.0005504'