Submission #425606

#TimeUsernameProblemLanguageResultExecution timeMemory
425606tht2005Factories (JOI14_factories)C++17
15 / 100
8052 ms127664 KiB
/* * Written by * ______ _ _ ______ ____ ____ ____ ____ * |_ _|| |_| ||_ _||_ || __ || __ |/ _/ * | | | _ | | | / / || |||| ||| |__ * | | | | | | | | | |_ ||__||||__||\__ \ * |__| |_| |_| |__| |___||____||____|/____/ */ //#include "factories.h" #include <bits/stdc++.h> using namespace std; #define nmax 500050 #define ll long long #define ii pair<int, int> const ll inf = (ll)1e15; int n, sz[nmax], p[nmax], r[nmax], parent[nmax][25], depth[nmax]; ll ans[nmax], sum[nmax]; vector<ii> adj[nmax]; /* // delete before submit * int q, s, t, x[nmax], y[nmax], a[nmax], b[nmax], d[nmax]; */ int dfs(int u, int p = -1) { sz[u] = 1; for(auto [C, v]: adj[u]) { if(v != p && !r[v]) sz[u] += dfs(v, u); } return sz[u]; } int find_centroid(int m, int u, int p = -1) { for(auto [C, v]: adj[u]) { if(v != p && !r[v] && 2 * sz[v] > m) return find_centroid(m, v, u); } return u; } int centroid(int u = 0) { u = find_centroid(dfs(u), u); r[u] = 1; p[u] = -1; for(auto [C, v]: adj[u]) { if(!r[v]) p[centroid(v)] = u; } return u; } void dfs2(int u, int p = -1) { for(int j = 1; j <= 19; ++j) { parent[u][j] = parent[u][j - 1] != -1 ? parent[parent[u][j - 1]][j - 1] : -1; } for(auto [C, v]: adj[u]) { if(v == p) continue; parent[v][0] = u; depth[v] = depth[u] + 1; sum[v] = sum[u] + C; dfs2(v, u); } } int lca(int x, int y) { if(depth[x] > depth[y]) swap(x, y); for(int j = 19; j >= 0; --j) { if(parent[y][j] != -1 && depth[x] <= depth[parent[y][j]]) y = parent[y][j]; } if(x == y) return x; for(int j = 19; j >= 0; --j) { if(parent[x][j] != parent[y][j]) x = parent[x][j], y = parent[y][j]; } return parent[x][0]; } inline ll dist(int x, int y) { return sum[x] + sum[y] - 2 * sum[lca(x, y)]; } void Init(int N, int A[], int B[], int D[]) { n = N; for(int i = 0; i < n - 1; ++i) { adj[A[i]].push_back(ii(D[i], B[i])); adj[B[i]].push_back(ii(D[i], A[i])); } centroid(); fill(ans, ans + n, inf); sum[0] = depth[0] = 0; parent[0][0] = -1; dfs2(0); } void update(int y, bool del) { for(int x = y; x != -1; x = p[x]) { if(del) ans[x] = inf; else ans[x] = min(ans[x], dist(x, y)); } } ll get(int y) { ll res = inf; for(int x = y; x != -1; x = p[x]) res = min(res, ans[x] + dist(x, y)); return res; } ll Query(int S, int X[], int T, int Y[]) { ll res = inf; for(int i = 0; i < S; ++i) { update(X[i], 0); } for(int i = 0; i < T; ++i) { res = min(res, get(Y[i])); } for(int i = 0; i < S; ++i) { update(X[i], 1); } return res; } /* void solve() * { * cin >> n >> q; * for(int i = 0; i < n - 1; ++i) { * cin >> a[i] >> b[i] >> d[i]; * } * Init(n, a, b, d); * while(q--) { * cin >> s >> t; * for(int i = 0; i < s; ++i) * cin >> x[i]; * for(int i = 0; i < t; ++i) * cin >> y[i]; * cout << Query(s, x, t, y) << '\n'; * } * } * * int main() * { * ios::sync_with_stdio(false); cin.tie(NULL); * // freopen("in.inp", "r", stdin); * // freopen("out.out", "w", stdout); * // freopen("err.txt", "w", stderr); * int T; * for(T = 1; T--;) { * solve(); * } * return 0; * } */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...