Submission #585947

#TimeUsernameProblemLanguageResultExecution timeMemory
585947M_WFactories (JOI14_factories)C++17
100 / 100
4682 ms186712 KiB
#include <bits/stdc++.h> #define ii pair<int, long long> using namespace std; int sz[500005], lvl[500005], pa[500005]; bool blocked[500005]; vector<ii> adj[500005]; long long dist[21][500005]; // Centroid void dfs(int a, int p){ sz[a] = 1; for(auto [x, w]: adj[a]){ if(blocked[x] || x == p) continue; dfs(x, a); sz[a] += sz[x]; } } void dfs_dis(int a, int p, int lv){ for(auto [x, w] : adj[a]){ if(x == p || blocked[x]) continue; dist[lv][x] = dist[lv][a] + w; dfs_dis(x, a, lv); } } void dec(int a, int p){ dfs(a, a); int cur = a, prev = -1; while(true){ int mx = -1, ch; for(auto [x, w] : adj[cur]){ if(blocked[x] || x == prev) continue; if(sz[x] > mx){ mx = sz[x]; ch = x; } } if(mx * 2 > sz[a]){ prev = cur; cur = ch; } else break; } lvl[cur] = p == -1 ? 0 : lvl[p] + 1; dfs_dis(cur, cur, lvl[cur]); blocked[cur] = true; pa[cur] = p; for(auto [x, w] : adj[cur]) if(!blocked[x]) dec(x, cur); } long long val[500005]; void Init(int N, int A[], int B[], int D[]){ for(int i = 0; i < N - 1; i++){ adj[A[i]].push_back({B[i], D[i] * 1ll}); adj[B[i]].push_back({A[i], D[i] * 1ll}); } dec(0, -1); for(int i = 0; i < N; i++) val[i] = 1e15; } void upd(int u){ int old_u = u; for(; u != -1; u = pa[u]){ val[u] = min(val[u], dist[lvl[u]][old_u]); } } long long query(int u){ long long res = 1e15; int old_u = u; for(; u != -1; u = pa[u]){ res = min(res, val[u] + dist[lvl[u]][old_u]); } return res; } void reset(int u){ for(; u != -1; u = pa[u]) val[u] = 1e15; } long long Query(int S, int X[], int T, int Y[]) { long long res = 1e15; for(int i = 0; i < S; i++) upd(X[i]); for(int i = 0; i < T; i++) res = min(res, query(Y[i])); for(int i = 0; i < S; i++) reset(X[i]); return res; }

Compilation message (stderr)

factories.cpp: In function 'void dec(int, int)':
factories.cpp:51:49: warning: 'ch' may be used uninitialized in this function [-Wmaybe-uninitialized]
   51 |  for(auto [x, w] : adj[cur]) if(!blocked[x]) dec(x, cur);
      |                                              ~~~^~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...