# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1177540 | LmaoLmao | Race (IOI11_race) | C++20 | 0 ms | 0 KiB |
#include<bits/stdc++.h>
#define fi first
#define se second
#define int long long
using namespace std;
using ll = long long;
using ii = pair<ll, ll>;
using aa = array<int,3>;
const int N = 1e6+1;
const int INF = 1e9;
int s[200005];
bool del[200005];
vector<ii> adj[200005];
int mp[1000005];
int d,k,ans;
int dfs(int u,int p) {
s[u]=1;
for(ii v:adj[u]) {
if(del[v.fi] || v.fi==p) continue;
s[u]+=dfs(v.fi,u);
}
return s[u];
}
int citron(int u,int p,int sz) {
for(ii v:adj[u]) {
if(del[v.fi] || v.fi==p) continue;
if(s[v.fi]*2>sz) return citron(v.fi,u,sz);
}
return u;
}
void get(int u,int p,int cur,int len,int type) {
d=max(d,cur);
if(len>k) return;
if(type) {
ans=min(ans,cur+mp[k-len]);
}
else {
mp[len]=min(mp[len],cur);
}
//if(u==1 && cur==1) cout << mp[1];
for(ii v:adj[u]) {
if(v.fi!=p && !del[v.fi]) get(v.fi,u,cur+1,len+v.se,type);
}
}
void build(int u) {
int ctr=citron(u,0,dfs(u,0));
d=0;
del[ctr]=1;
for(ii v:adj[ctr]) {
if(!del[v.fi]) {
get(v.fi,0,1,v.se,1);
get(v.fi,0,1,v.se,0);
//if(ctr==2) cout << k << ' ' << v << endl;
}
}
//cout << ans << ' ' << d << endl;
for(int i=1;i<=d;i++) {
mp[i]=1e9;
}
for(ii v:adj[ctr]) {
if(del[v.fi]) continue;
build(v.fi);
}
}
int best_path(int N, int K, int H[][2], int L[]){
int n = N;
k = K;
for(int i = 0; i + 1 < n; ++i){
int u = H[i][0]+1, v = H[i][1]+1, w = L[i];
adj[u].push_back({v, w});
g[v].push_back({u, w});
}
ans=1e9;
build(1);
return (ans == 1e9 ? -1 : ans);
}