답안 #530084

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
530084 2022-02-24T14:20:48 Z Alex_tz307 Valley (BOI19_valley) C++17
100 / 100
217 ms 37564 KB
#include <bits/stdc++.h>

using namespace std;

const int kN = 1e5;
const int kLog = 16;
const int64_t INF = 1e18L;
vector<tuple<int, int, int>> g[1 + kN];
int s[kN], node[kN], depth[1 + kN], anc[1 + kN][1 + kLog];
int64_t dp[1 + kN], bst[1 + kN], best[1 + kN][1 + kLog];

void minSelf(int64_t &x, int64_t y) {
  if (y < x) {
    x = y;
  }
}

void dfs(int u) {
  for (int i = 1; i <= kLog; ++i) {
    anc[u][i] = anc[anc[u][i - 1]][i - 1];
    if (anc[u][i] == 0) {
      break;
    }
  }
  bst[u] = INF;
  for (auto it : g[u]) {
    int v, w, index;
    tie(v, w, index) = it;
    if (v != anc[u][0]) {
      node[index] = v;
      depth[v] = depth[u] + 1;
      dp[v] = dp[u] + w;
      anc[v][0] = u;
      dfs(v);
    }
  }
}

int64_t lift(int &v, int level) {
  int64_t ans = bst[v];
  for (int i = kLog; i >= 0; --i) {
    if (depth[v] - (1 << i) >= level) {
      minSelf(ans, best[v][i]);
      v = anc[v][i];
    }
  }
  return ans;
}

void testCase() {
  int n, m, q, root;
  cin >> n >> m >> q >> root;
  for (int i = 1; i < n; ++i) {
    int u, v, w;
    cin >> u >> v >> w;
    g[u].emplace_back(v, w, i);
    g[v].emplace_back(u, w, i);
  }
  for (int i = 0; i < m; ++i) {
    cin >> s[i];
  }
  dfs(root);
  sort(s, s + m, [&](const int &u, const int &v) -> bool {
    return dp[u] < dp[v];
  });
  for (int i = 0; i < m; ++i) {
    int v = s[i];
    while (v) {
      if (bst[v] != INF) {
        break;
     }
      bst[v] = dp[s[i]] - 2 * dp[v];
      v = anc[v][0];
    }
  }
  for (int v = 1; v <= n; ++v) {
    best[v][0] = bst[anc[v][0]];
  }
  for (int j = 1; j <= kLog; ++j) {
    for (int i = 1; i <= n; ++i) {
      best[i][j] = min(best[i][j - 1], best[anc[i][j - 1]][j - 1]);
    }
  }
  for (int i = 0; i < q; ++i) {
    int index, v;
    cin >> index >> v;
    int u = v;
    lift(u, depth[node[index]]);
    if (u != node[index]) {
      cout << "escaped\n";
      continue;
    }
    int64_t ans = dp[v] + lift(v, depth[node[index]]);
    if (ans >= INF) {
      cout << "oo\n";
    } else {
      cout << ans << '\n';
    }
  }
}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  int tests = 1;
  for (int tc = 0; tc < tests; ++tc) {
    testCase();
  }
  return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 2764 KB Output is correct
2 Correct 4 ms 2764 KB Output is correct
3 Correct 3 ms 2808 KB Output is correct
4 Correct 3 ms 2764 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 2764 KB Output is correct
2 Correct 4 ms 2764 KB Output is correct
3 Correct 3 ms 2808 KB Output is correct
4 Correct 3 ms 2764 KB Output is correct
5 Correct 2 ms 2892 KB Output is correct
6 Correct 2 ms 2892 KB Output is correct
7 Correct 2 ms 2892 KB Output is correct
8 Correct 2 ms 2936 KB Output is correct
9 Correct 2 ms 2940 KB Output is correct
10 Correct 4 ms 2892 KB Output is correct
11 Correct 4 ms 2892 KB Output is correct
12 Correct 3 ms 2892 KB Output is correct
13 Correct 3 ms 2940 KB Output is correct
14 Correct 3 ms 2940 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 126 ms 34244 KB Output is correct
2 Correct 186 ms 33884 KB Output is correct
3 Correct 142 ms 33816 KB Output is correct
4 Correct 185 ms 35588 KB Output is correct
5 Correct 170 ms 35540 KB Output is correct
6 Correct 198 ms 37236 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 2764 KB Output is correct
2 Correct 4 ms 2764 KB Output is correct
3 Correct 3 ms 2808 KB Output is correct
4 Correct 3 ms 2764 KB Output is correct
5 Correct 2 ms 2892 KB Output is correct
6 Correct 2 ms 2892 KB Output is correct
7 Correct 2 ms 2892 KB Output is correct
8 Correct 2 ms 2936 KB Output is correct
9 Correct 2 ms 2940 KB Output is correct
10 Correct 4 ms 2892 KB Output is correct
11 Correct 4 ms 2892 KB Output is correct
12 Correct 3 ms 2892 KB Output is correct
13 Correct 3 ms 2940 KB Output is correct
14 Correct 3 ms 2940 KB Output is correct
15 Correct 126 ms 34244 KB Output is correct
16 Correct 186 ms 33884 KB Output is correct
17 Correct 142 ms 33816 KB Output is correct
18 Correct 185 ms 35588 KB Output is correct
19 Correct 170 ms 35540 KB Output is correct
20 Correct 198 ms 37236 KB Output is correct
21 Correct 119 ms 33320 KB Output is correct
22 Correct 146 ms 33012 KB Output is correct
23 Correct 126 ms 32776 KB Output is correct
24 Correct 194 ms 34980 KB Output is correct
25 Correct 178 ms 37564 KB Output is correct
26 Correct 114 ms 33404 KB Output is correct
27 Correct 127 ms 33016 KB Output is correct
28 Correct 130 ms 32880 KB Output is correct
29 Correct 157 ms 34256 KB Output is correct
30 Correct 200 ms 35668 KB Output is correct
31 Correct 140 ms 33528 KB Output is correct
32 Correct 122 ms 33068 KB Output is correct
33 Correct 160 ms 33144 KB Output is correct
34 Correct 196 ms 34800 KB Output is correct
35 Correct 217 ms 37408 KB Output is correct
36 Correct 180 ms 35240 KB Output is correct