| # | Time | Username | Problem | Language | Result | Execution time | Memory |
|---|---|---|---|---|---|---|---|
| 786040 | vjudge1 | 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;
#define int long long
#define ii pair<int,int>
const int ms = 1e5 + 5;
int sz[ms], dis[ms];
int n, sum, ans, k;
vector<ii> g[ms];
void put(int u, int p, int d, int qtd=0){
if(d > k) return;
dis[d] = min(dis[d], qtd);
for(auto [v, w] : g[u]){
if(v == p) continue;
put(v, u, d+w, qtd+1);
}
}
void qry(int u, int p, int d, int qtd=0){
if(d > k) return;
ans = min(ans, dis[d] + dis[k-d]);
for(auto [v, w] : g[u]){
if(v == p) continue;
qry(v, u, d+w, qtd+1);
}
}
void clean(int u, int p, int d){
if(d > k) return;
dis[d] = n + 100;
for(auto [v, w] :g[u]){
if(v == p) continue;
clean(v, u, d +w);
}
}
void dfs(int u, int p = -1, bool keep = false){
int big = -1;
for(auto [v, w] : g[u]){
if(v == p) continue;
if(big == -1 || sz[big] < sz[v]){
big = v;
}
}
for(auto [v, w] : g[u]){
if(v == p || v == big) continue;
dfs(v, u, false);
}
if(big != -1) dfs(big, u, true);
for(auto [v, w] : g[u]){
if(v == big || v == p) continue;
qry(v, u, w, 1);
put(v, u, w, 1);
}
if(!keep){
clean(u, p, 0);
dis[0] = 0;
}
}
int getSz(int u=0, int p=-1){
sz[u] = 1;
for(auto [v, w] : g[u]){
if(v == p) continue;
sz[u] += getSz(v, u);
}
return sz[u];
}
int best_path(int N, int K, int H[][2], int L[]){
k = K;
n = N;
for(int i=1; i<n; i++){
g[H[i][0]].push_back({H[i][1], L[i]});
g[H[i][1]].push_back({H[i][0], L[i]});
}
memset(dis, 0x3f, sizeof dis);
dis[0] = 0;
ans = n+ 100;
getSz();
dfs(0);
if(ans > n){
return -1;
}
return ans;
}
