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 "factories.h"
#include <bits/stdc++.h>
using namespace std;
namespace
{
vector<vector<pair<int, long>>> adj, gr;
vector<int> sub;
vector<bool> done;
vector<long> dp;
} // namespace
int subtree(int u, int p)
{
sub[u] = 1;
for (auto [v, d] : adj[u])
{
if (v != p && !done[v])
sub[u] += subtree(v, u);
}
return sub[u];
}
int get_centroid(int sz, int u, int p)
{
for (auto [v, d] : adj[u])
{
if (v != p && !done[v])
{
if (sub[v] * 2 > sz)
return get_centroid(sz, v, u);
}
}
return u;
}
void dfs(int r, int u, int p, long dist)
{
gr[u].emplace_back(r, dist);
for (auto [v, d] : adj[u])
{
if (v != p && !done[v])
dfs(r, v, u, dist + d);
}
}
void rec(int u)
{
int cen = get_centroid(subtree(u, -1), u, -1);
dfs(cen, cen, -1, 0);
done[cen] = 1;
for (auto [v, d] : adj[cen])
{
if (!done[v])
rec(v);
}
}
void upd(int u)
{
for (auto [r, dist] : gr[u])
dp[r] = min(dp[r], dist);
}
long qry(int u)
{
long x = LONG_MAX;
for (auto [r, dist] : gr[u])
{
if (dp[r] != LONG_MAX)
x = min(x, dist + dp[r]);
}
return x;
}
void reset(int u)
{
for (auto [r, dist] : gr[u])
dp[r] = LONG_MAX;
}
void Init(int N, int A[], int B[], int D[])
{
adj.assign(N, vector<pair<int, long>>());
for (int i = 0; i < N - 1; i++)
{
adj[A[i]].emplace_back(B[i], D[i]);
adj[B[i]].emplace_back(A[i], D[i]);
}
sub.assign(N, 0);
done.assign(N, 0);
gr.assign(N, vector<pair<int, long>>());
rec(0);
dp.assign(N, LONG_MAX);
}
long long Query(int S, int X[], int T, int Y[])
{
for (int i = 0; i < S; i++)
upd(X[i]);
long cost = LONG_MAX;
for (int i = 0; i < T; i++)
cost = min(cost, qry(Y[i]));
for (int i = 0; i < S; i++)
reset(X[i]);
return cost;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |