Submission #1316567

#TimeUsernameProblemLanguageResultExecution timeMemory
1316567a.pendovFactories (JOI14_factories)C++20
0 / 100
2305 ms258196 KiB
#include "factories.h" #include "bits/stdc++.h" using namespace std; const long long MAXN=500000,inf=10000000000000000LL; int pod[MAXN]; long long nearest[MAXN]; bool used[MAXN]; vector<pair<int,long long>> anc[MAXN]; vector<pair<int,int>> edg[MAXN]; inline long long min1(long long a,long long b) { if(a>b)return b; return a; } int getSubSize(int start,int f) { pod[start]=1; for(auto i:edg[start]) { if(used[i.first]||f==i.first)continue; pod[start]+=getSubSize(i.first,start); } return pod[start]; } int findCentr(int start,int f,int sz) { for(auto i:edg[start]) { if(used[i.first]||f==i.first)continue; if(pod[i.first]>sz/2)return findCentr(i.first,start,sz); } return start; } void findDist(int start,int f,int dist,int centrAnc) { anc[start].push_back({centrAnc,dist}); for(auto i:edg[start]) { if(used[i.first]||f==i.first)continue; findDist(i.first,start,dist+i.second,centrAnc); } } void centrDec(int start) { int centr=findCentr(start,-1,getSubSize(start,-1)); used[centr]=1; anc[centr].push_back({centr,0}); for(auto i:edg[centr]) { if(used[i.first])continue; findDist(i.first,-1,i.second,centr); } for(auto i:edg[centr]) { if(used[i.first])continue; centrDec(i.first); } } void addNode(int n) { for(auto i:anc[n]) { nearest[i.first]=min1(nearest[i.first],i.second); } } long long query(int n) { long long ans=inf; for(auto i:anc[n]) { ans=min1(nearest[i.first]+i.second,ans); } return ans; } void Init(int N, int A[], int B[], int D[]) { for(int i=0;i<N-1;i++) { edg[A[i]].push_back({B[i],D[i]}); edg[B[i]].push_back({A[i],D[i]}); } centrDec(0); for(int i=0;i<N;i++) { nearest[i]=inf; } } long long Query(int S, int X[], int T, int Y[]) { long long ans=inf; for(int i=0;i<S;i++) { addNode(X[i]); } for(int i=0;i<T;i++) { ans=min1(ans,query(Y[i])); } for(int i=0;i<S;i++) { for(auto j:anc[X[i]]) { nearest[j.first]=inf; } } return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...