제출 #104359

#제출 시각아이디문제언어결과실행 시간메모리
104359nvmdavaRace (IOI11_race)C++17
100 / 100
730 ms30968 KiB
#include "race.h" #include <bits/stdc++.h> #define N 200005 #define pb push_back #define ff first #define ss second #define pii pair<int, int> using namespace std; bool blocked[N]; int n, s; vector<pii> adj[N]; int sz[N]; int sumsz; int len[5 * N]; int get_size(int v, int p){ sz[v] = 1; for(auto& c : adj[v]){ if(c.ff == p || blocked[c.ff]) continue; sz[v] += get_size(c.ff, v); } return sz[v]; } int get_centroid(int v, int p){ for(auto& c : adj[v]){ if(c.ff == p || blocked[c.ff]) continue; if(sz[c.ff] >= sumsz / 2) return get_centroid(c.ff, v); } return v; } int ans = N; queue<pii> q; queue<int> lol; void dfs(int v, int p, int l, int cnt){ if(s >= l)ans = min(ans, len[s - l] + cnt); else return; q.push({l, cnt}); lol.push(l); cnt++; for(auto& c : adj[v]){ if(c.ff == p || blocked[c.ff]) continue; dfs(c.ff, v, l + c.ss, cnt); } if(p == -1){ while(!q.empty()){ len[q.front().ff] = min(len[q.front().ff], q.front().ss); q.pop(); } } } void decomp(int v){ sumsz = get_size(v, -1); v = get_centroid(v, -1); blocked[v] = 1; len[0] = 0; for(auto &c : adj[v]){ if(blocked[c.ff]) continue; dfs(c.ff, -1, c.ss, 1); } while(!lol.empty()){ len[lol.front()] = 0x3f3f3f3f; lol.pop(); } for(auto &c : adj[v]){ if(blocked[c.ff]) continue; decomp(c.ff); } } int best_path(int n, int s, int h[][2], int l[]){ ::n = n; ::s = s; memset(len, 0x3f, sizeof len); for(int i = 0; i < n - 1; i++){ adj[h[i][0]].pb({h[i][1], l[i]}); adj[h[i][1]].pb({h[i][0], l[i]}); } decomp(1); return (ans == N ? -1 : ans); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...