제출 #953437

#제출 시각아이디문제언어결과실행 시간메모리
953437Juanchoki경주 (Race) (IOI11_race)C++14
0 / 100
3 ms12636 KiB
#include <bits/stdc++.h> #include "race.h" #define ll long long #define deb(x) cout << #x << ':' << ' ' << x << endl; using namespace std; struct tpos { ll v, w; }; ll freq[1<<20], subarbol[1<<18], padre[1<<18]; bool visi[1<<18]; ll resp = 1LL<<62; ll N, k; vector<tpos> adj[1<<18]; int iter = 0; ll centroide (ll yo, ll pa, ll n) { //if (iter++ > 5000) exit(0); 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; //padre[yo] = pa; // cout << yo << endl; // if (iter++ > 5000) exit(0); for (tpos v: adj[yo]) { if (v.v == pa) continue; if (visi[v.v]) continue; subarbol[yo] += dfs(v.v, yo); } return subarbol[yo]; } ll MM; void dfs2 (ll yo, ll pa, ll peso, ll camino) { if (peso > k) return; if (peso == k) resp = min(resp, camino); //cout << MM << ':' << ' ' << yo << ' ' << peso << endl; if (freq[k-peso] != 0) resp = min(resp, camino+freq[k-peso]); if (freq[peso] == 0) freq[peso] = camino; freq[peso] = min(camino, freq[peso]); for (tpos v: adj[yo]) { if (v.v == pa) continue; if (visi[v.v]) 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; if (visi[v.v]) continue; dfs3(v.v, yo, peso + v.w); } } void responde (ll pa, ll mero_mero) { dfs2(mero_mero, padre[mero_mero], 0, 0); MM = mero_mero; //deb(mero_mero); visi[mero_mero] = 1; dfs3(mero_mero, padre[mero_mero], 0); for (tpos v: adj[mero_mero]) { //if (v.v == pa) continue; if (visi[v.v]) continue; dfs(v.v, mero_mero); ll mm = centroide(v.v, mero_mero, subarbol[v.v]); responde(mero_mero, mm); } } int best_path(int N, int K, int H[][2], int L[]) { k = K; //cout << N << ' ' << K << endl; 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]}); } dfs(0, -1); //ll mm = centroide(0, -1, subarbol[0]); //MM = mm; //responde(-1, mm); 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...