Submission #953364

#TimeUsernameProblemLanguageResultExecution timeMemory
953364JuanchokiRace (IOI11_race)C++14
0 / 100
3012 ms262144 KiB
#include <bits/stdc++.h> #include "race.h" #define ll long long using namespace std; struct tpos { ll v, w; }; ll freq[1<<20], subarbol[1<<20]; bool visi[1<<20]; ll resp = 1LL<<62; ll N, k; vector<tpos> adj[1<<20]; ll centroide (ll yo, ll pa, ll n) { for (tpos v: adj[yo]) { if (v.v == pa) continue; if (subarbol[v.v] > n/2) return centroide(v.v, yo, n); } return yo; } ll dfs(ll yo, ll pa) { subarbol[yo] = 1; for (tpos v: adj[yo]) { if (v.v == pa) continue; subarbol[yo] += dfs(v.v, yo); } return subarbol[yo]; } void dfs2 (ll yo, ll pa, ll peso, ll camino) { if (freq[peso] == 0) freq[peso] = camino; freq[peso] = min(camino, freq[peso]); if (peso == k) resp = min(resp, camino); if (freq[k-peso] != 0) resp = min(resp, freq[peso]+freq[k-peso]); for (tpos v: adj[yo]) { if (v.v == pa) continue; dfs2(v.v, yo, peso + v.w, camino+1); } } void dfs3(ll yo, ll pa, ll peso) { if (peso > k) return; freq[peso] = 0; for (tpos v: adj[yo]) { if (v.v == pa) continue; dfs3(v.v, yo, peso + v.w); } } void responde (ll yo, ll pa) { ll mero_mero = centroide(yo, pa, subarbol[yo]); yo = mero_mero; dfs2(yo, pa, 0, 0); dfs3(yo, pa, 0); for (tpos v: adj[yo]) { responde(v.v, yo); } } int best_path(int N, int K, int H[][2], int L[]) { ::N = N; k = K; for (ll i = 0; i < N-1; i++) { adj[H[i][1]].push_back({H[i][0], L[i]}); adj[H[i][0]].push_back({H[i][1], L[i]}); } responde(1, -1); if (resp == 1LL<<62) resp = -1; return resp; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...