Submission #694978

#TimeUsernameProblemLanguageResultExecution timeMemory
694978four_specksFactories (JOI14_factories)C++17
100 / 100
4505 ms368072 KiB
#include "factories.h" #include <bits/stdc++.h> using namespace std; namespace { vector<vector<pair<int, long>>> adj, gr; vector<int> sub; vector<bool> done; vector<long> dp; } // namespace int subtree(int u, int p) { sub[u] = 1; for (auto [v, d] : adj[u]) { if (v != p && !done[v]) sub[u] += subtree(v, u); } return sub[u]; } int get_centroid(int sz, int u, int p) { for (auto [v, d] : adj[u]) { if (v != p && !done[v]) { if (sub[v] * 2 > sz) return get_centroid(sz, v, u); } } return u; } void dfs(int r, int u, int p, long dist) { gr[u].emplace_back(r, dist); for (auto [v, d] : adj[u]) { if (v != p && !done[v]) dfs(r, v, u, dist + d); } } void rec(int u) { int cen = get_centroid(subtree(u, -1), u, -1); dfs(cen, cen, -1, 0); done[cen] = 1; for (auto [v, d] : adj[cen]) { if (!done[v]) rec(v); } } void upd(int u) { for (auto [r, dist] : gr[u]) dp[r] = min(dp[r], dist); } long qry(int u) { long x = LONG_MAX; for (auto [r, dist] : gr[u]) { if (dp[r] != LONG_MAX) x = min(x, dist + dp[r]); } return x; } void reset(int u) { for (auto [r, dist] : gr[u]) dp[r] = LONG_MAX; } void Init(int N, int A[], int B[], int D[]) { adj.assign(N, vector<pair<int, long>>()); for (int i = 0; i < N - 1; i++) { adj[A[i]].emplace_back(B[i], D[i]); adj[B[i]].emplace_back(A[i], D[i]); } sub.assign(N, 0); done.assign(N, 0); gr.assign(N, vector<pair<int, long>>()); rec(0); dp.assign(N, LONG_MAX); } long long Query(int S, int X[], int T, int Y[]) { for (int i = 0; i < S; i++) upd(X[i]); long cost = LONG_MAX; for (int i = 0; i < T; i++) cost = min(cost, qry(Y[i])); for (int i = 0; i < S; i++) reset(X[i]); return cost; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...