This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#include "factories.h"
using namespace std;
#define mkp make_pair
const int MAXN = 5 * 100100, MAXLN = 20;
const long long LINF = 0x3f3f3f3f3f3f3f3f;
int n, sz[MAXN], cdp[MAXN];
long long aux[MAXN], cdpd[MAXN];
bool rmd[MAXN];
vector<pair<int, int>> g[MAXN];
void szdfs(int v, int p = -1)
{
sz[v] = 1;
for(const auto&[w, u] : g[v])
if(u != p && !rmd[u])
szdfs(u, v), sz[v] += sz[u];
}
int getCentroid(int v, int p = -1, int rt = -1)
{
if(rt == -1)
rt = v;
for(const auto&[w, u] : g[v])
if(u != p && !rmd[u] && sz[u] > sz[rt] / 2)
return getCentroid(u, v, rt);
return v;
}
long long getDist(int v, int trgt, int p = -1)
{
if(v == trgt)
return 0;
long long aux = LINF;
for(const auto&[w, u] : g[v])
if(u != p)
aux = min(aux, getDist(u, trgt, v) + w);
return aux;
}
void cd(int v, int cp = -1)
{
szdfs(v);
int c = getCentroid(v);
if(cp != -1)
cdpd[c] = getDist(c, cp);
cdp[c] = cp, rmd[c] = true;
for(const auto&[w, u] : g[c])
if(!rmd[u])
cd(u, c);
}
void Init(int N, int A[], int B[], int D[])
{
n = N;
for(int i = 0; i < n - 1; ++i)
g[A[i]].push_back(mkp(D[i], B[i])), g[B[i]].push_back(mkp(D[i], A[i]));
cd(0);
}
long long Query(int S, int X[], int T, int Y[])
{
long long ans = LINF, d;
for(int i = 0; i < n; ++i)
aux[i] = LINF;
for(int i = 0, cur; i < S; ++i)
{
cur = X[i], d = 0;
while(cur != -1)
{
aux[cur] = min(aux[cur], d);
d += cdpd[cur], cur = cdp[cur];
}
}
for(int i = 0, cur; i < T; ++i)
{
cur = Y[i], d = 0;
while(cur != -1)
{
ans = min(ans, aux[cur] + d);
d += cdpd[cur], cur = cdp[cur];
}
}
return ans;
}
Compilation message (stderr)
factories.cpp: In function 'void szdfs(int, int)':
factories.cpp:16:22: warning: unused variable 'w' [-Wunused-variable]
for(const auto&[w, u] : g[v])
^
factories.cpp: In function 'int getCentroid(int, int, int)':
factories.cpp:25:22: warning: unused variable 'w' [-Wunused-variable]
for(const auto&[w, u] : g[v])
^
factories.cpp: In function 'void cd(int, int)':
factories.cpp:49:22: warning: unused variable 'w' [-Wunused-variable]
for(const auto&[w, u] : g[c])
^
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |