Submission #1145378

#TimeUsernameProblemLanguageResultExecution timeMemory
1145378sanoRace (IOI11_race)C++20
100 / 100
638 ms44836 KiB
#include "race.h" #include<iostream> #include<vector> #include<queue> #include<deque> #include<string> #include<fstream> #include<algorithm> #include <iomanip> #include<map> #include <set> #include <unordered_map> #include <stack> #include <unordered_set> #include <cmath> #include <cstdint> #define shit short int #define ll long long #define For(i, n) for(int i = 0; i < (int)n; i++) #define ffor(i, a, n) for(int i = (int)a; i < (int)n; i++) #define rfor(i, n) for(int i = (int)n; i >= (int)0; i--) #define rffor(i, a, n) for(int i = (int)n; i >= (int)a; i--) #define vec vector #define ff first #define ss second #define pb push_back #define pii pair<int, int> #define NEK 1000000000 #define mod 1000000007 #define mod2 1000000009 #define rsz resize #define prv1 43 #define prv2 47 #define D 8 #define trav(a,x) for (auto& a: x) #define pb push_back #define ub upper_bound #define lb lower_bound #define sig 0.0000001 using namespace std; vec<vec<pii>> g; vec<int> pod; int n, k; vec<bool> je; int pods(int x, int pr = -1) { pod[x] = 1; for(auto&i : g[x]) { if (i.ff == pr) continue; if (je[i.ff]) continue; pod[x] += pods(i.ff, x); } return pod[x]; } int centroid(int x, int vel, int pr = -1) { for (auto i : g[x]) { if (i.ff == pr) continue; if (je[i.ff]) continue; if (pod[i.ff] * 2 > vel) return centroid(i.ff, vel, x); } return x; } int mini = -1; void dfs(int x, vec<pii>& h, int pr, int d, int dh) { h.push_back({ d, dh }); for (auto&i : g[x]) { if (i.ff == pr) continue; if (je[i.ff]) continue; dfs(i.ff, h, x, d + i.ss, dh + 1); } return; } void ries(int x) { pods(x); int c = centroid(x, pod[x]); unordered_map<int, int> umap; umap[0] = 0; for (auto i : g[c]) { if (je[i.ff]) continue; vec<pii> h; dfs(i.ff, h, c, i.ss, 1); for (auto j : h) { if (umap.find(k - j.ff) != umap.end()) { mini = min(mini, umap[k - j.ff] + j.ss); } } for (auto j : h) { if (umap.find(j.ff) == umap.end()) { umap[j.ff] = j.ss; } umap[j.ff] = min(umap[j.ff], j.ss); } } je[c] = 1; for (auto i : g[c]) { if (je[i.ff]) continue; ries(i.ff); } } int best_path(int n1, int k1, int h[][2], int l[]) { n = n1; k = k1; mini = n + 1; g.resize(n); pod.resize(n); je.resize(n, false); For(i, n-1) { g[h[i][0]].push_back({ h[i][1], l[i] }); g[h[i][1]].push_back({ h[i][0], l[i] }); } ries(0); if (mini == (n + 1)) mini = -1; return mini; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...