제출 #1144550

#제출 시각아이디문제언어결과실행 시간메모리
1144550zhasyn경주 (Race) (IOI11_race)C++20
0 / 100
3092 ms8040 KiB
#include "race.h" #include <bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define F first #define S second #define pll pair <ll, ll> const ll N = 2 * 1e5 + 100, M = 1e6 + 100; vector <pll> q[N]; int k, ans = INT_MAX; bool was[N]; int need[N], cnt[N]; void dfs(int v, int pred){ cnt[v] = 1; for(auto u : q[v]){ if(u.F == pred) continue; dfs(u.F, v); cnt[v] += cnt[u.F]; } } int get(int v, int p){ for(auto u : q[v]){ if(u.F == p || was[u.F]) continue; if(cnt[u.F] * 2 >= cnt[v]) return get(u.F, v); } return v; } vector <int >vec; void obs(int v, int pred, int sum, int ct, int code){ if(sum == k) ans = min(ans, ct); if(sum < k){ if(code == 0){ if(need[k - sum] != 0) ans = min(ans, ct + need[k - sum]); } else{ if(need[sum] == 0) need[sum] = ct; else need[sum] = min(need[sum], ct); vec.pb(sum); } } for(auto u : q[v]){ if(was[u.F] || pred == u.F) continue; obs(u.F, v, sum + u.S, ct + 1, code); } } void centroid(int v){ v = get(v, -1); was[v] = true; for(auto u : q[v]){ obs(u.F, u.S, 0, 1, 0); obs(u.F, u.S, 0, 1, 1); } for(auto u : vec){ need[u] = 0; } for(auto u : q[v]){ centroid(u.F); } } int best_path(int n, int gk, int h[][2], int l[]){ k = gk; for(int i = 0; i < n - 1; i++){ q[h[i][0]].pb({h[i][1], l[i]}); q[h[i][1]].pb({h[i][0], l[i]}); } dfs(1, -1); centroid(1); if(ans == INT_MAX) return -1; return ans; } // int main(){ // // return 0; // }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...