Submission #645447

#TimeUsernameProblemLanguageResultExecution timeMemory
645447karriganFactories (JOI14_factories)C++14
0 / 100
90 ms12448 KiB
#include "factories.h" #include<bits/stdc++.h> using namespace std; const long long mx=1e15; struct edg{ int v; long long w; }; vector<edg>g[500001]; long long dis[500001]; int dep[500001]; int st[500001][21]; int sub[500001]; int use[500001]; void dfs(int u,int par){ for (auto v:g[u]){ if (v.v==par)continue; dis[v.v]=v.w+dis[u]; dep[v.v]=dep[u]+1; st[v.v][0]=u; dfs(v.v,u); } } int lca(int u,int v){ if (dep[u]<dep[v])swap(u,v); int k=dep[u]-dep[v]; for (int i=20;i>=0;i--){ if (k>>i&1){ u=st[u][i]; } } if (u==v)return u; for (int i=20;i>=0;i--){ if (st[u][i]==0||st[v][i]==0)continue; if (st[u][i]!=st[v][i]){ u=st[u][i]; v=st[v][i]; } } return st[u][0]; } long long cal(int u,int v){ return dis[u]+dis[v]-2*dis[lca(u,v)]; } int dfs2(int u,int par){ sub[u]=1; for (auto v:g[u]){ int lm=v.v; if (use[lm]||lm==par)continue; dfs2(lm,u); sub[u]+=sub[lm]; } return sub[u]; } int centroid(int u,int p,int sz){ for (auto v:g[u]){ if (use[v.v]||v.v==p)continue; if (sub[v.v]*2>sz)return centroid(v.v,u,sz); } return u; } int par[500001]; long long mxx[500001]; int decompose(int u,int p){ int sz=dfs2(u,0); int cen=centroid(u,0,sz); use[cen]=1; if (p!=0){ par[cen]=p; } for (auto v:g[cen]){ if (use[v.v])continue; decompose(v.v,cen); } return cen; } void Init(int n,int a[],int b[],int d[]){ for (int i=0;i<n-1;i++){ a[i]++; b[i]++; g[a[i]].push_back({b[i],d[i]}); g[b[i]].push_back({a[i],d[i]}); } dfs(1,0); for (int i=1;i<=20;i++){ for (int j=1;j<=n;j++){ st[j][i-1]=st[st[j][i-1]][i-1]; } } for (int i=1;i<=n;i++){ mxx[i]=1e17; } decompose(1,0); } void update(int u,int pos){ if (pos==0)return; mxx[pos]=min(mxx[u],cal(u,pos)); update(u,par[pos]); } void res(int u,int pos){ if (pos==0)return; mxx[pos]=1e17; res(u,par[pos]); } long long get(int u,int pos){ long long ans=1e17; if (pos==0)return ans; ans=min(ans,cal(u,pos)+mxx[pos]); ans=min(ans,get(u,par[pos])); return ans; } long long Query(int s,int x[],int t,int y[]){ long long ans=1e17; for (int i=0;i<s;i++){ for (int j=0;j<t;j++){ ans=min(ans,cal(x[i]+1,y[j]+1)); } } return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...