QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#206824#7338. Education NightmareMaGnsi0WA 3286ms39556kbC++172.3kb2023-10-07 23:02:192023-10-07 23:02:19

Judging History

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

  • [2023-10-07 23:02:19]
  • 评测
  • 测评结果:WA
  • 用时:3286ms
  • 内存:39556kb
  • [2023-10-07 23:02:19]
  • 提交

answer

/**
 *    author:  MaGnsi0
 *    created: 07.10.2023 12:42:52
**/
#include <bits/stdc++.h>

using namespace std;

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int T;
    cin >> T;
    while (T--) {
        int n, s, m;
        cin >> n >> s >> m;
        vector<vector<int>> adj(n);
        for (int i = 0; i < n - 1; ++i) {
            int u, v;
            cin >> u >> v;
            adj[u - 1].push_back(v - 1);
            adj[v - 1].push_back(u - 1);
        }
        vector<bool> on_path(n, false), m_sup(n, false);
        vector<int64_t> dm(n, 0), ds(n, 0), par(n, -1);
        function<void(int, int, bool)> dfs1 = [&](int v, int p, bool x) {
            bool y = x || (v == m - 1);
            if (y) { m_sup[v] = true; }
            for (int u : adj[v]) {
                if (u == p) { continue; }
                par[u] = v;
                ds[u] = ds[v] + 1;
                dfs1(u, v, y);
            }
        };
        dfs1(s - 1, -1, false);
        function<void(int, int)> dfs2 = [&](int v, int p) {
            for (int u : adj[v]) {
                if (u == p) { continue; }
                dm[u] = dm[v] + 1;
                dfs2(u, v);
            }
        };
        dfs2(m - 1, -1);
        for (int u = m - 1; u != -1; u = par[u]) {
            on_path[u] = true;
        }
        vector<int> I(n);
        iota(I.begin(), I.end(), 0);
        sort(I.begin(), I.end(), [&](int i, int j) {
                return dm[i] > dm[j];
            });
        int64_t ans = INT_MAX, x = 0;
        set<int> picked;
        multiset<int64_t> not_picked;
        for (int i = 0; i < n; ++i) {
            if (!on_path[i] && !m_sup[i]) {
                not_picked.insert(dm[i]);
                ans = max(ans, ds[m - 1] + dm[i]);
            } else {
                ans = max(ans, ds[i]);
            }
        }
        for (int v : I) {
            if (m_sup[v]) { break; }
                x = max(x, dm[v] - ds[v]); 
            while (!picked.count(v) && !on_path[v]) {
                picked.insert(v);
                not_picked.erase(not_picked.find(dm[v]));
                v = par[v];
            }
            ans = min(ans, x + (not_picked.empty() ? 0 : *not_picked.rbegin()) + 2 * (int64_t)picked.size());
        }
        cout << ans << "\n";
    }
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

input:

1
4 2 3
1 2
1 3
1 4

output:

4

result:

ok 1 number(s): "4"

Test #2:

score: -100
Wrong Answer
time: 3286ms
memory: 39556kb

input:

14966
15 13 8
7 14
7 10
5 3
1 3
15 3
1 13
9 5
7 2
6 13
10 11
13 8
5 10
5 12
14 4
16 14 9
16 11
14 9
8 15
14 15
13 10
6 11
3 2
9 5
6 7
10 6
6 8
1 5
15 4
10 2
11 12
100 49 58
67 43
55 34
84 42
3 74
84 54
20 6
86 83
88 51
2 99
4 78
91 64
14 59
82 38
91 44
24 12
12 2
39 19
43 46
5 80
41 35
80 97
79 8
47...

output:

22
19
102
17
3
13
118
10
107
13
11
169
8
2147483647
121
7
2147483647
2147483647
104
17
158
144
78
102
7
106
2147483647
2147483647
2147483647
9
75
99
10
14
7
161
95
2147483647
13
2
3
18
13
23
15
4
74
86
63
11
2147483647
149
2147483647
2147483647
1
81
13
131
69
2147483647
2147483647
120
2147483647
7
2...

result:

wrong answer 1st numbers differ - expected: '9', found: '22'