Submission #589458

#TimeUsernameProblemLanguageResultExecution timeMemory
589458Duy_eValley (BOI19_valley)C++14
100 / 100
209 ms52264 KiB
/* ** TASK: ** LINK: */ #include <bits/stdc++.h> #define ll long long #define pii pair<ll, ll> #define st first #define nd second #define file "test" using namespace std; const long long INF = 1e18; const long long N = 2e5 + 5; struct edge { ll u, v, w, id; } g[N]; ll n, s, q, e, shop[N], up[20][N], h[N], dpUp[20][N], f[N], dp[N]; vector <int> d[N]; void dfs(int p, int u) { for (int i: d[u]) { int v = g[i].u ^ g[i].v ^ u, w = g[i].w; if (v == p) continue; g[i].u = u; g[i].v = v; h[v] = h[u] + 1; up[0][v] = u; f[v] = f[u] + w; dfs(u, v); dp[u] = min(dp[u], dp[v] + w); } for (int i: d[u]) { int v = g[i].u ^ g[i].v ^ u, w = g[i].w; if (v == p) continue; dpUp[0][v] = dp[u] - f[u]; } } int jump(int u, int k) { for (int i = 19; i >= 0; i --) if ((k >> i) & 1) u = up[i][u]; return u; } bool isANC(int p, int u) { int delta = h[u] - h[p]; return jump(u, delta) == p; } ll get(int u, int k) { ll ans = INF; for (int i = 19; i >= 0; i --) if ((k >> i) & 1) { ans = min(ans, dpUp[i][u]); u = up[i][u]; } return ans; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> s >> q >> e; for (int i = 1; i < n; i ++) { cin >> g[i].u >> g[i].v >> g[i].w; g[i].id = i; d[g[i].u].push_back(i); d[g[i].v].push_back(i); } for (int i = 0; i < 20; i ++) for (int j = 1; j <= n; j ++) dpUp[i][j] = INF; for (int i = 1, x; i <= s; i ++) cin >> x, shop[x] = true; for (int i = 1; i <= n; i ++) if (shop[i]) dp[i] = 0; else dp[i] = INF; // "e" is root dfs(e, e); for (int i = 1; i < 20; i ++) for (int j = 1; j <= n; j ++) { up[i][j] = up[i - 1][up[i - 1][j]]; dpUp[i][j] = min(dpUp[i - 1][j], dpUp[i - 1][up[i - 1][j]]); } int I, R; while (q --) { cin >> I >> R; int u = g[I].u, v = g[I].v; if (!isANC(v, R)) { cout << "escaped\n"; continue; } if (dp[v] == INF) { cout << "oo\n"; continue; } cout << min(f[R] + get(R, h[R] - h[v]), dp[R]) << '\n'; } return 0; } /** /\_/\ * (= ._.) * / >🍵 \>🍮 **/

Compilation message (stderr)

valley.cpp:111:9: warning: "/*" within comment [-Wcomment]
  111 | /**  /\_/\
      |          
valley.cpp: In function 'void dfs(int, int)':
valley.cpp:33:54: warning: unused variable 'w' [-Wunused-variable]
   33 |     for (int i: d[u]) { int v = g[i].u ^ g[i].v ^ u, w = g[i].w;
      |                                                      ^
valley.cpp: In function 'int main()':
valley.cpp:94:13: warning: unused variable 'u' [-Wunused-variable]
   94 |         int u = g[I].u, v = g[I].v;
      |             ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...