Submission #681218

#TimeUsernameProblemLanguageResultExecution timeMemory
681218SanguineChameleonFactories (JOI14_factories)C++17
100 / 100
3181 ms175280 KiB
#include "factories.h" #include <bits/stdc++.h> using namespace std; const int ms = 5e5 + 20; const long long inf = 1e18L + 20; const int st = 20; vector<pair<int, int>> adj[ms]; vector<pair<int, long long>> vch[ms]; long long de[ms]; int ti[ms]; int to[ms]; int f[ms]; long long dp[ms][2]; int par[ms][st]; int tz; void dfs1(int u, int pr) { ti[u] = ++tz; for (auto x: adj[u]) { int v = x.first; int w = x.second; if (v != pr) { par[v][0] = u; de[v] = de[u] + w; dfs1(v, u); } } to[u] = ++tz; } bool cmp(int u, int v) { return ti[u] < ti[v]; } bool anc(int u, int v) { return ti[u] < ti[v] && to[v] < to[u]; } int lca(int u, int v) { if (anc(u, v)) { return u; } if (anc(v, u)) { return v; } for (int i = st - 1; i >= 0; i--) { if (!anc(par[u][i], v)) { u = par[u][i]; } } return par[u][0]; } void Init(int N, int A[], int B[], int D[]) { for (int i = 0; i < N - 1; i++) { int u = A[i]; int v = B[i]; u++; v++; int w = D[i]; adj[u].push_back({v, w}); adj[v].push_back({u, w}); } for (int i = 1; i <= N; i++) { f[i] = -1; } par[1][0] = 1; dfs1(1, -1); for (int k = 1; k < st; k++) { for (int i = 1; i <= N; i++) { par[i][k] = par[par[i][k - 1]][k - 1]; } } } void dfs2(int u) { dp[u][0] = inf; dp[u][1] = inf; if (f[u] != -1) { dp[u][f[u]] = 0; } for (auto x: vch[u]) { int v = x.first; long long w = x.second; dfs2(v); dp[u][0] = min(dp[u][0], dp[v][0] + w); dp[u][1] = min(dp[u][1], dp[v][1] + w); } } long long Query(int S, int X[], int T, int Y[]) { vector<int> q; for (int i = 0; i < S; i++) { int u = X[i]; u++; f[u] = 0; q.push_back(u); } for (int i = 0; i < T; i++) { int u = Y[i]; u++; f[u] = 1; q.push_back(u); } int sz = q.size(); sort(q.begin(), q.end(), cmp); for (int i = 0; i < sz - 1; i++) { q.push_back(lca(q[i], q[i + 1])); } sort(q.begin(), q.end(), cmp); q.erase(unique(q.begin(), q.end()), q.end()); sz = q.size(); int root = q[0]; vector<int> p = {root}; for (int i = 1; i < sz; i++) { int v = q[i]; while (!anc(p.back(), v)) { p.pop_back(); } int u = p.back(); vch[u].push_back({v, de[v] - de[u]}); p.push_back(v); } dfs2(root); long long res = inf; for (auto u: q) { res = min(res, dp[u][0] + dp[u][1]); vch[u].clear(); f[u] = -1; } return res; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...