Submission #1281794

#TimeUsernameProblemLanguageResultExecution timeMemory
1281794dhuyyyyFactories (JOI14_factories)C++20
100 / 100
2674 ms350772 KiB
#include<bits/stdc++.h> #include "factories.h" #define fi first #define se second //#define int long long using namespace std; using ll = long long; using ii = pair<int, int>; using aa = array<int,3>; const int N = 5e5+5; int n, m, u, v, x, root; int sz[N]; long long res, c, dist[N]; bool num[N]; vector <pair<int,long long>> adj[N], anc[N]; void getSize(int u,int p){ sz[u] = 1; for (pair<int, long long> it : adj[u]){ if (num[it.fi] || it.fi == p) continue; getSize(it.fi,u); sz[u] += sz[it.fi]; } } int getCentroid(int u,int p,int n){ for (pair<int, long long> it : adj[u]){ if (num[it.fi] || it.fi == p) continue; if (sz[it.fi] * 2 > n) return getCentroid(it.fi,u,n); } return u; } void dfs(int u,int p,int root,long long length){ anc[u].push_back({root,length}); for (pair<int, long long> it : adj[u]){ if (num[it.fi] || it.fi == p) continue; dfs(it.fi,u,root,length + it.se); } } void decompose(int u){ getSize(u,0); m = sz[u]; root = getCentroid(u,0,m); num[root] = 1; for (pair<int,long long> it : adj[root]){ if (num[it.fi]) continue; dfs(it.fi,root,root,it.se); } for (pair<int,long long> it : adj[root]){ if (num[it.fi]) continue; decompose(it.fi); } } void update(int u,int type){ for (pair<int,long long> it : anc[u]){ if (type) dist[it.fi] = 1e18; else dist[it.fi] = min(dist[it.fi],it.se); } } void get(int u){ for (pair<int, long long> it : anc[u]){ res = min(res,dist[it.fi] + it.se); } } void Init(int N, int A[], int B[], int D[]){ n = N; for (int i = 0; i < n - 1; i++){ u = A[i] + 1; v = B[i] + 1; c = D[i]; adj[u].push_back({v,c}); adj[v].push_back({u,c}); } for (int i = 1; i <= n; i++){ dist[i] = 1e18; anc[i].push_back({i,0}); } decompose(1); } long long Query(int S, int X[], int T, int Y[]){ res = 1e18; for (int i = 0; i < S; i++) X[i]++; for (int i = 0; i < T; i++) Y[i]++; for (int i = 0; i < S; i++) update(X[i],0); for (int i = 0; i < T; i++) get(Y[i]); for (int i = 0; i < S; i++) update(X[i],1); return res; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...