# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
518995 | fabijan_cikac | Race (IOI11_race) | C++17 | 0 ms | 0 KiB |
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>
using namespace std;
typedef long long int ll;
typedef pair<ll, ll> pp;
const int MAXN = 2 * 1e5 + 100;
const int INF = 1e9;
struct mapa{
int val = INF;
};
int n; ll k;
vector<pp> v[MAXN];
int p[MAXN] = { 0 };
int vel[MAXN] = { 0 };
map<ll, mapa> m;
vector<ll> s;
int sol = INF;
int cnt = 0;
int dfs(int x, int depth, ll sum, int val, ll k){
p[x] = 1;
if (val == 0)
++cnt;
else if (val == 1 && sum <= k){
int zb = depth + m[k - sum].val - 1;
sol = min(sol, zb);
}
else if (val == 2 && sum <= k){
s.push_back(sum);
m[sum].val = min(m[sum].val, depth);
}
for (int i = 0; i < v[x].size(); ++i){
int y = v[x][i].first;
if (!p[y]){
int rt = dfs(y, depth + 1, sum + v[x][i].second, val, k);
if (val == 0)
vel[x] += rt;
}
}
if (val == 0)
++vel[x];
p[x] = 0;
if (val == 0)
return vel[x];
return 0;
}
int centr(int x){
pp maks = {-1, -1};
for (int i = 0; i < v[x].size(); ++i){
int y = v[x][i].first;
if (!p[y] && vel[y] > maks.second)
maks = {y, vel[y]};
}
if (maks.second <= cnt / 2)
return x;
return maks.first;
}
void solve(int x, int K){
s.clear();
for (int i = 0; i < v[x].size(); ++i){
int y = v[x][i].first;
if (!p[y]){
dfs(y, 2, v[x][i].second, 1, K); dfs(y, 2, v[x][i].second, 2, K);
}
}
for (int i = 0; i < s.size(); ++i)
m[s[i]].val = INF;
s.clear(); return;
}
void decompose(int x, int K){
cnt = 0; dfs(x, 1, 0, 0, K);
int root = centr(x); p[root] = 1;
solve(root, K);
for (int i = 0; i < v[root].size(); ++i){
int y = v[root][i].first;
if (!p[y]) decompose(y, K);
}
}
int best_path(int N, int K, int H[MAXN][2], ll L[MAXN]){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
for (int i = 0; i < N - 1; ++i){
v[H[i][0]].push_back({H[i][1], L[i]});
v[H[i][1]].push_back({H[i][0], L[i]});
}
decompose(0, K);
if (sol == INF)
return -1;
else return (sol - 1);
return 0;
}