Submission #1185988

#TimeUsernameProblemLanguageResultExecution timeMemory
1185988g4yuhgFactories (JOI14_factories)C++17
100 / 100
2821 ms356372 KiB
#include "factories.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; #define pii pair<ll, ll> const int N = 500005; const ll INF = 1e18; vector<pii> adj[N]; int del[N], child[N]; ll high[N], dist[N], min_dist[N]; vector<pii> par[N]; void cnt_child(int u, int parent) { child[u] = 1; for (auto &v : adj[u]) { if (v.first == parent || del[v.first]) continue; cnt_child(v.first, u); child[u] += child[v.first]; } } int get_centroid(int u, int parent, int total) { for (auto &v : adj[u]) { if (v.first == parent || del[v.first]) continue; if (child[v.first] > total / 2) return get_centroid(v.first, u, total); } return u; } void dfs(int u, int parent, int root) { par[u].emplace_back(root, dist[u]); for (auto &v : adj[u]) { if (v.first == parent || del[v.first]) continue; high[v.first] = high[u] + 1; dist[v.first] = dist[u] + v.second; dfs(v.first, u, root); } } void build_centroid(int u) { cnt_child(u, -1); int c = get_centroid(u, -1, child[u]); high[c] = dist[c] = 0; dfs(c, -1, c); del[c] = 1; for (auto &v : adj[c]) { if (!del[v.first]) build_centroid(v.first); } } void Init(int n, int A[], int B[], int D[]) { for (int i = 0; i < n - 1; i++) { int u = A[i], v = B[i], w = D[i]; adj[u].emplace_back(v, w); adj[v].emplace_back(u, w); } build_centroid(0); for (int i = 0; i < n; i++) { min_dist[i] = INF; } } long long Query(int S, int X[], int T, int Y[]) { vector<int> temp; // lưu lại các đỉnh được cập nhật để khôi phục sau for (int i = 0; i < S; i++) { int u = X[i]; for (auto &p : par[u]) { min_dist[p.first] = min(min_dist[p.first], p.second); temp.push_back(p.first); } } ll res = INF; for (int i = 0; i < T; i++) { int u = Y[i]; for (auto &p : par[u]) { res = min(res, p.second + min_dist[p.first]); } } for (int x : temp) { min_dist[x] = INF; // khôi phục lại } return res; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...