Task: | Nautilus |
Sender: | MojoLake |
Submission time: | 2023-04-18 17:01:18 +0300 |
Language: | C++ (C++17) |
Status: | READY |
Result: | 0 |
group | verdict | score |
---|---|---|
#1 | RUNTIME ERROR | 0 |
#2 | RUNTIME ERROR | 0 |
#3 | RUNTIME ERROR | 0 |
test | verdict | time | group | |
---|---|---|---|---|
#1 | RUNTIME ERROR | 0.01 s | 2, 3 | details |
#2 | RUNTIME ERROR | 0.01 s | 1, 2, 3 | details |
#3 | RUNTIME ERROR | 0.01 s | 1, 2, 3 | details |
#4 | RUNTIME ERROR | 0.01 s | 1, 2, 3 | details |
#5 | RUNTIME ERROR | 0.01 s | 1, 2, 3 | details |
#6 | RUNTIME ERROR | 0.01 s | 1, 2, 3 | details |
#7 | RUNTIME ERROR | 0.01 s | 1, 2, 3 | details |
#8 | RUNTIME ERROR | 0.01 s | 2, 3 | details |
#9 | RUNTIME ERROR | 0.01 s | 2, 3 | details |
#10 | RUNTIME ERROR | 0.01 s | 2, 3 | details |
#11 | RUNTIME ERROR | 0.01 s | 2, 3 | details |
#12 | RUNTIME ERROR | 0.01 s | 2, 3 | details |
#13 | RUNTIME ERROR | 0.01 s | 2, 3 | details |
#14 | RUNTIME ERROR | 0.01 s | 2, 3 | details |
#15 | RUNTIME ERROR | 0.01 s | 2, 3 | details |
#16 | RUNTIME ERROR | 0.01 s | 2, 3 | details |
#17 | RUNTIME ERROR | 0.01 s | 2, 3 | details |
#18 | RUNTIME ERROR | 0.01 s | 2, 3 | details |
#19 | RUNTIME ERROR | 0.01 s | 2, 3 | details |
#20 | RUNTIME ERROR | 0.01 s | 2, 3 | details |
#21 | RUNTIME ERROR | 0.01 s | 2, 3 | details |
#22 | RUNTIME ERROR | 0.01 s | 2, 3 | details |
#23 | RUNTIME ERROR | 0.01 s | 3 | details |
#24 | RUNTIME ERROR | 0.01 s | 3 | details |
#25 | RUNTIME ERROR | 0.01 s | 3 | details |
#26 | RUNTIME ERROR | 0.01 s | 3 | details |
#27 | RUNTIME ERROR | 0.01 s | 3 | details |
#28 | RUNTIME ERROR | 0.01 s | 3 | details |
#29 | RUNTIME ERROR | 0.01 s | 3 | details |
#30 | RUNTIME ERROR | 0.01 s | 3 | details |
#31 | RUNTIME ERROR | 0.01 s | 3 | details |
#32 | RUNTIME ERROR | 0.01 s | 3 | details |
#33 | RUNTIME ERROR | 0.01 s | 3 | details |
#34 | RUNTIME ERROR | 0.01 s | 3 | details |
#35 | RUNTIME ERROR | 0.01 s | 3 | details |
#36 | RUNTIME ERROR | 0.01 s | 3 | details |
#37 | RUNTIME ERROR | 0.01 s | 3 | details |
Code
#include <bits/stdc++.h> #define debug(x) cout << #x << ": " << x << "\n" #define all(x) x.begin(), x.end() using namespace std; using std::sort; using ll = long long; const int N = 1e5 + 1; const int LOG = 20; const int M = 101; const int inf = 1e9; const ll LLinf = 1e16; vector<pair<int, ll>> g[N]; vector<pair<int, int>> edges; int par[N]; bool shop[N]; int jump[N][LOG], depth[N]; ll weight_d[N]; ll up[N]; vector<pair<ll, int>> down[N]; int n, s, q, e; void first_dfs(int cur, int pre){ par[cur] = pre; jump[cur][0] = pre; depth[cur] = depth[pre] + 1; for(auto [nex, w] : g[cur]){ if(nex == pre)continue; // cost_jump[nex][0] = w; weight_d[nex] = weight_d[cur] + w; first_dfs(nex, cur); } } void create_jump(){ for(int j = 1; j < LOG; ++j){ for(int i = 1; i <= n; ++i){ jump[i][j] = jump[jump[i][j-1]][j-1]; // cost_jump[i][j] = cost_jump[i][j-1] + cost_jump[jump[i][j-1]][j-1]; } } } bool solve(int ind, int node){ auto [p, c] = edges[ind]; if(par[c] != p)swap(p, c); assert(par[c] == p); // cout << p << " " << c << "\n"; // cout << node << "\n"; if(c == node)return 0; if(depth[c] >= depth[node])return 1; for(int j = LOG - 1; j >= 0; --j){ int nex = jump[node][j]; if(depth[nex] >= depth[c]){ node = nex; } } // cqout << node << " " << c << "\n\n"; return node != c; } ll calc_down(int cur, int pre){ if(shop[cur])down[cur].push_back({0, -1}); else down[cur].push_back({LLinf, -1}); for(int i = 0; i < (int)g[cur].size(); ++i){ auto [nex, w] = g[cur][i]; if(nex == pre)continue; down[cur].push_back({calc_down(nex, cur) + w, nex}); } sort(all(down[cur])); return down[cur].begin()->first; } void calc_up(int cur, int pre, ll mn_dis){ if(!shop[cur])up[cur] = mn_dis; for(int i = 0; i < (int)g[cur].size(); ++i){ auto [nex, w] = g[cur][i]; if(nex == pre)continue; ll add = down[cur].begin()->first ; if(down[cur].begin()->second == nex)add = down[cur][1].first; ll cur_mn = min(mn_dis, add) + w; calc_up(nex, cur, cur_mn); } } int lca(int a, int b){ if(depth[a] < depth[b])swap(a, b); for(int j = LOG - 1; j >= 0; --j){ int nex = jump[a][j]; if(depth[nex] >= depth[b]){ a = nex; } } assert(depth[a] == depth[b]); for(int j = LOG - 1; j >= 0; --j){ while(jump[a][j] != jump[b][j]){ a = jump[a][j]; b = jump[b][j]; } } if(a == b)return a; return jump[a][0]; } ll dist(int a, int b){ int c = lca(a, b); return weight_d[a] + weight_d[b] - 2ll * weight_d[c]; } ll calc_min_dis(int ind, int node){ auto [p, c] = edges[ind]; if(par[c] != p)swap(p, c); assert(par[c] == p); ll dis = -1; assert(lca(node, c) == c); // cout << node << " " << p << " " << c << "\n"; // cout << down[node].begin()->first << "\n"; // cout << dist(node, c ) << "\n"; if(node == c){ dis = down[node].begin()->first; }else if(lca(node, c) == c){ dis = down[node].begin()->first; if(up[node] <= up[c])dis = min(dis, up[node]); int node_up = node; for(int j = LOG - 1; j >= 0; --j){ int nex = jump[node_up][j]; if(depth[nex] > depth[c]){ node_up = nex; } } // cout << node << " " << node_up << " " << p << " " << c << "\n"; ll dis_down = down[c].begin()->first; if(down[c].begin()->second == node_up){ dis_down = down[c][1].first; } dis = min(dis, dist(node, c) + dis_down); // cout << dist(node, c) << " " << dis_down << "\n"; // ll x = dist(node, c) - dis_down; // if(x > 0)dis = min(dis, x); // cout << "yayy\n" << node << " " << c << "\n"; }else if(lca(node, p) == p){ ll dis_down = down[p].begin()->first; if(down[p].begin()->second == c){ dis_down = down[p][1].first; } dis = min(down[node].begin()->first, dist(node, p) + min(up[p], dis_down)); assert(0); } if(dis > (ll)1e15)return -1; return dis; } int main(){ // cin.tie(0)->sync_with_stdio(0); cin >> n >> s >> q >> e; for(int _ = 0; _ < n - 1; ++_){ int a, b; ll w; cin >> a >> b >> w; g[a].push_back({b, w}); g[b].push_back({a, w}); edges.push_back({min(a, b), max(a, b)}); } for(int _ = 0; _ < s; ++_){ int c; cin >> c; shop[c] = 1; } first_dfs(e, 0); create_jump(); calc_down(e, 0); calc_up(e, 0, shop[e] ? 0 : LLinf); // for(int i = 1; i <= n; ++i){ // cout << i << " " << up[i] << " " << down[i].begin()->first << "\n"; // } while(q--){ int I, R; cin >> I >> R; if(solve(I-1, R)){ cout << "escaped\n"; }else{ ll res = calc_min_dis(I-1, R); if(res == -1)cout << "oo\n"; else cout << res << "\n"; } } // how to check if we can reach the root? // The road is cuts our way iff the endpoint // (p, c) has depth smaller AND lca(node, c) == p with // (note the special case, then we have to check) // How to find closest shop? First we can precompute // with tree dp to each direction for each node. // But how to handle the removal of an edge? // // Let the edge removed be (p, c), that is, (parent, child) // and the node be a. // // if c is an ancestor of a (lca(a, c) == c): // answer is min(down[a], dis(a, c) + down[c]) // else if p is an ancestor of a (lca(a, p) == p): // answer is min(down[a], dis(a, p) + min(up[p], down[p] (not including the direction to c))) // else if p is in the subtree of a: // answer is min(up[a], down[a] (not including direction of p), dis(a, p) - up[p] (if positive), dis(a, p) + down[p] (not including the direction of c)) // else they just have a lowest common ancestor lca(a, p) // answer is min(down[a], dis(a, lca) + up[lca], dis(a, lca) + down[lca] (not including the direction of p), dis(a, lca) + dis(lca, p) - up[p] (if this is positive)) // think about the case when a is either p or a!! }
Test details
Test 1
Group: 2, 3
Verdict: RUNTIME ERROR
input |
---|
5 9 7 ...##.... ..#.##..# ..#....## .##...#.. ... |
correct output |
---|
22 |
user output |
---|
(empty) |
Test 2
Group: 1, 2, 3
Verdict: RUNTIME ERROR
input |
---|
100 100 100 ................................. |
correct output |
---|
8272 |
user output |
---|
(empty) |
Test 3
Group: 1, 2, 3
Verdict: RUNTIME ERROR
input |
---|
100 100 100 .#...#.#..#.....#.........#...... |
correct output |
---|
5 |
user output |
---|
(empty) |
Test 4
Group: 1, 2, 3
Verdict: RUNTIME ERROR
input |
---|
100 100 100 .#...##...#...##....##.#.##..#... |
correct output |
---|
1 |
user output |
---|
(empty) |
Test 5
Group: 1, 2, 3
Verdict: RUNTIME ERROR
input |
---|
100 100 100 ..#.#.#..###.#.#.##..########.... |
correct output |
---|
1 |
user output |
---|
(empty) |
Test 6
Group: 1, 2, 3
Verdict: RUNTIME ERROR
input |
---|
100 100 100 .#.#.###########..#.###.######... |
correct output |
---|
1 |
user output |
---|
(empty) |
Test 7
Group: 1, 2, 3
Verdict: RUNTIME ERROR
input |
---|
100 100 100 ##############################... |
correct output |
---|
1 |
user output |
---|
(empty) |
Test 8
Group: 2, 3
Verdict: RUNTIME ERROR
input |
---|
100 100 100 ................................. |
correct output |
---|
9503 |
user output |
---|
(empty) |
Test 9
Group: 2, 3
Verdict: RUNTIME ERROR
input |
---|
100 100 100 #..#.##..#....##...#.##.##..#.... |
correct output |
---|
495 |
user output |
---|
(empty) |
Test 10
Group: 2, 3
Verdict: RUNTIME ERROR
input |
---|
100 100 100 #.#...######.#####.#.##...#.##... |
correct output |
---|
51 |
user output |
---|
(empty) |
Test 11
Group: 2, 3
Verdict: RUNTIME ERROR
input |
---|
100 100 100 .#.#.###########..#.###.######... |
correct output |
---|
34 |
user output |
---|
(empty) |
Test 12
Group: 2, 3
Verdict: RUNTIME ERROR
input |
---|
100 100 100 ##############################... |
correct output |
---|
19 |
user output |
---|
(empty) |
Test 13
Group: 2, 3
Verdict: RUNTIME ERROR
input |
---|
100 100 100 ................................. |
correct output |
---|
9801 |
user output |
---|
(empty) |
Test 14
Group: 2, 3
Verdict: RUNTIME ERROR
input |
---|
100 100 100 ..............#.................. |
correct output |
---|
7479 |
user output |
---|
(empty) |
Test 15
Group: 2, 3
Verdict: RUNTIME ERROR
input |
---|
100 100 100 #.#.........###.#..#.#..####.#... |
correct output |
---|
5328 |
user output |
---|
(empty) |
Test 16
Group: 2, 3
Verdict: RUNTIME ERROR
input |
---|
100 100 100 .#.#.###########..#.###.######... |
correct output |
---|
127 |
user output |
---|
(empty) |
Test 17
Group: 2, 3
Verdict: RUNTIME ERROR
input |
---|
100 100 100 ##############################... |
correct output |
---|
19 |
user output |
---|
(empty) |
Test 18
Group: 2, 3
Verdict: RUNTIME ERROR
input |
---|
100 100 100 ................................. |
correct output |
---|
10000 |
user output |
---|
(empty) |
Test 19
Group: 2, 3
Verdict: RUNTIME ERROR
input |
---|
100 100 100 ..............#.................. |
correct output |
---|
8047 |
user output |
---|
(empty) |
Test 20
Group: 2, 3
Verdict: RUNTIME ERROR
input |
---|
100 100 100 #.#...######.#####.#.##...#.##... |
correct output |
---|
3500 |
user output |
---|
(empty) |
Test 21
Group: 2, 3
Verdict: RUNTIME ERROR
input |
---|
100 100 100 .#.#.###########..#.###.######... |
correct output |
---|
1228 |
user output |
---|
(empty) |
Test 22
Group: 2, 3
Verdict: RUNTIME ERROR
input |
---|
100 100 100 ##############################... |
correct output |
---|
43 |
user output |
---|
(empty) |
Test 23
Group: 3
Verdict: RUNTIME ERROR
input |
---|
500 500 5000 ................................. |
correct output |
---|
249493 |
user output |
---|
(empty) |
Test 24
Group: 3
Verdict: RUNTIME ERROR
input |
---|
500 500 5000 #..#.##..#....##...#.##.##..#.... |
correct output |
---|
222 |
user output |
---|
(empty) |
Test 25
Group: 3
Verdict: RUNTIME ERROR
input |
---|
500 500 5000 .#####....####..###...####.#.#... |
correct output |
---|
1268 |
user output |
---|
(empty) |
Test 26
Group: 3
Verdict: RUNTIME ERROR
input |
---|
500 500 5000 #.#####.##..#####.####..######... |
correct output |
---|
805 |
user output |
---|
(empty) |
Test 27
Group: 3
Verdict: RUNTIME ERROR
input |
---|
500 500 5000 ##############################... |
correct output |
---|
349 |
user output |
---|
(empty) |
Test 28
Group: 3
Verdict: RUNTIME ERROR
input |
---|
500 500 5000 ................................. |
correct output |
---|
249999 |
user output |
---|
(empty) |
Test 29
Group: 3
Verdict: RUNTIME ERROR
input |
---|
500 500 5000 ..............#.................. |
correct output |
---|
197917 |
user output |
---|
(empty) |
Test 30
Group: 3
Verdict: RUNTIME ERROR
input |
---|
500 500 5000 #.#.........###.#..#.#..####.#... |
correct output |
---|
79550 |
user output |
---|
(empty) |
Test 31
Group: 3
Verdict: RUNTIME ERROR
input |
---|
500 500 5000 #.#####.##..#####.####..######... |
correct output |
---|
1221 |
user output |
---|
(empty) |
Test 32
Group: 3
Verdict: RUNTIME ERROR
input |
---|
500 500 5000 ##############################... |
correct output |
---|
1414 |
user output |
---|
(empty) |
Test 33
Group: 3
Verdict: RUNTIME ERROR
input |
---|
500 500 5000 ................................. |
correct output |
---|
250000 |
user output |
---|
(empty) |
Test 34
Group: 3
Verdict: RUNTIME ERROR
input |
---|
500 500 5000 ..............#.................. |
correct output |
---|
199752 |
user output |
---|
(empty) |
Test 35
Group: 3
Verdict: RUNTIME ERROR
input |
---|
500 500 5000 .#####....####..###...####.#.#... |
correct output |
---|
87691 |
user output |
---|
(empty) |
Test 36
Group: 3
Verdict: RUNTIME ERROR
input |
---|
500 500 5000 #.#####.##..#####.####..######... |
correct output |
---|
30998 |
user output |
---|
(empty) |
Test 37
Group: 3
Verdict: RUNTIME ERROR
input |
---|
500 500 5000 ##############################... |
correct output |
---|
1440 |
user output |
---|
(empty) |