Submission #895488

#TimeUsernameProblemLanguageResultExecution timeMemory
89548812345678Factories (JOI14_factories)C++17
100 / 100
3177 ms210308 KiB
#include "factories.h" #include <bits/stdc++.h> using namespace std; #define ll long long const int nx=5e5+5, kx=21; ll ds[kx][nx], c[nx], sz[nx], dp[nx], lvl[nx]; vector<pair<ll, ll>> d[nx]; bool used[nx]; vector<ll> rem; int dfssz(int u, int p) { sz[u]=1; for (auto [v, w]:d[u]) if (v!=p&&!used[v]) sz[u]+=dfssz(v, u); return sz[u]; } int findcentroid(int u, int p, int rtsz) { for (auto [v, w]:d[u]) if (v!=p&&!used[v]&&2*sz[v]>rtsz) return findcentroid(v, u, rtsz); return u; } void calcdist(int u, int p, ll dist, int dpt) { ds[dpt][u]=dist; for (auto [v, w]:d[u]) if (v!=p&&!used[v]) calcdist(v, u, dist+w, dpt); } void decomposition(int u, int p, int dpt) { u=findcentroid(u, u, dfssz(u, u)); used[u]=1; c[u]=p; lvl[u]=dpt; calcdist(u, u, 0, dpt); for (auto [v, w]:d[u]) if (v!=p&&!used[v]) decomposition(v, u, dpt+1); } void update(int u) { int rt=u; while (u!=-1) dp[u]=min(dp[u], ds[lvl[u]][rt]), rem.push_back(u), u=c[u]; } ll query(int u) { ll tmp=LLONG_MAX, rt=u; while (u!=-1) tmp=(dp[u]!=LLONG_MAX)?min(tmp, ds[lvl[u]][rt]+dp[u]):tmp, u=c[u]; return tmp; } void Init(int N, int A[], int B[], int D[]) { for (int i=0; i<N-1; i++) d[A[i]].push_back({B[i], D[i]}), d[B[i]].push_back({A[i], D[i]}); for (int i=0; i<N; i++) dp[i]=LLONG_MAX; decomposition(0, -1, 1); } long long Query(int S, int X[], int T, int Y[]) { ll res=LLONG_MAX; for (int i=0; i<S; i++) update(X[i]); for (int i=0; i<T; i++) res=min(res, query(Y[i])); for (auto x:rem) dp[x]=LLONG_MAX; rem.clear(); return res; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...