Submission #754775

#TimeUsernameProblemLanguageResultExecution timeMemory
754775Desh03Factories (JOI14_factories)C++17
15 / 100
8079 ms95384 KiB
#include <bits/stdc++.h> using namespace std; const long long INF = 1e18; vector<long long> d, mn; vector<int> dep, sz, par; vector<bool> centroid; vector<vector<pair<int, int>>> g; vector<vector<int>> up; int lg; void dfs(int u) { for (int i = 1; i < lg; i++) up[i][u] = up[i - 1][up[i - 1][u]]; for (auto [v, w] : g[u]) if (v ^ up[0][u]) d[v] = d[u] + w, dep[v] = dep[u] + 1, up[0][v] = u, dfs(v); } int lca(int u, int v) { if (dep[u] < dep[v]) swap(u, v); int k = dep[u] - dep[v]; for (int i = 0; i < lg; i++) if (k >> i & 1) u = up[i][u]; if (u == v) return u; for (int i = lg - 1; i >= 0; i--) if (up[i][u] ^ up[i][v]) u = up[i][u], v = up[i][v]; return up[0][u]; } long long dist(int u, int v) { return d[u] + d[v] - (d[lca(u, v)] << 1); } int findcentroid(int u, int p, int root) { for (auto [v, w] : g[u]) if (v ^ p && !centroid[v] && sz[v] << 1 > sz[root]) return findcentroid(v, u, root); return u; } void calcsz(int u, int p) { sz[u] = 1; for (auto [v, w] : g[u]) if (v ^ p && !centroid[v]) calcsz(v, u), sz[u] += sz[v]; } int centroid_decompose(int u) { calcsz(u, u); int x = findcentroid(u, u, u); centroid[x] = 1; for (auto [v, w] : g[x]) if (!centroid[v]) par[centroid_decompose(v)] = x; return x; } void update(int u) { int x = u; while (u != -1) { mn[u] = min(mn[u], dist(x, u)); u = par[u]; } } void reset(int u) { while (u != -1) { mn[u] = INF; u = par[u]; } } long long qry(int u) { int x = u; long long ret = INF; while (u != -1) { ret = min(ret, mn[u] + dist(x, u)); u = par[u]; } return ret; } void Init(int n, int a[], int b[], int c[]) { while ((1 << lg) <= n) ++lg; g.resize(n), d.resize(n), dep.resize(n), sz.resize(n), par.resize(n, -1), mn.resize(n, INF), centroid.resize(n); up = vector<vector<int>> (lg, vector<int> (n)); for (int i = 0; i < n - 1; i++) { g[a[i]].push_back({b[i], c[i]}); g[b[i]].push_back({a[i], c[i]}); } dfs(0); centroid_decompose(0); } long long Query(int s, int x[], int t, int y[]) { for (int i = 0; i < s; i++) update(x[i]); long long ans = INF; for (int i = 0; i < t; i++) ans = min(ans, qry(y[i])); for (int i = 0; i < s; i++) reset(x[i]); return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...