Submission #1224489

#TimeUsernameProblemLanguageResultExecution timeMemory
1224489BlockOGPaths (RMI21_paths)C++20
12 / 100
367 ms30116 KiB
#include <bits/stdc++.h> // mrrrow meeow :3 // vivid/stasis! free on steam go play using namespace std; vector<pair<int, int>> adj[100000]; int par[100000][17]; long long dpar[100000][17]; int depth[100000]; int n, k; void get_pars(int i, int p=-1, int d=0) { depth[i] = d; for (pair<int, int> j : adj[i]) { if (j.first == p) continue; par[j.first][0] = i; dpar[j.first][0] = j.second; get_pars(j.first, i, d + 1); } } int get_par(int i, int d) { for (int j = 0; j < 17; j++, d /= 2) { if (d & 1) i = par[i][j]; } return i; } long long get_distance(int i, int d) { long long res = 0; for (int j = 0; j < 17; j++, d /= 2) { if (d & 1) res += dpar[i][j], i = par[i][j]; } return res; } pair<long long, int> furthest(int i, int p=-1, long long d=0) { pair<long long, int> res = { d, i }; for (pair<int, int> j : adj[i]) { if (j.first == p) continue; res = max(res, furthest(j.first, i, d + j.second)); } return res; } long long distance(int a, int b) { long long res; if (depth[a] > depth[b]) res = get_distance(a, depth[a] - depth[b]), a = get_par(a, depth[a] - depth[b]); else res = get_distance(b, depth[b] - depth[a]), b = get_par(b, depth[b] - depth[a]); int l = 0, r = n; while (l < r) { int mid = (l + r) / 2; if (get_par(a, mid) == get_par(b, mid)) r = mid; else l = mid + 1; } return res + get_distance(a, l) + get_distance(b, l); } int main() { cin >> n >> k; for (int i = 1; i < n; i++) { int a, b, c; cin >> a >> b >> c; a--, b--; adj[a].push_back({ b, c }); adj[b].push_back({ a, c }); } get_pars(0); for (int j = 1; j < 17; j++) { for (int i = 0; i < n; i++) { par[i][j] = par[par[i][j - 1]][j - 1]; dpar[i][j] = dpar[i][j - 1] + dpar[par[i][j - 1]][j - 1]; } } int fa = furthest(0).second; int fb = furthest(fa).second; for (int i = 0; i < n; i++) cout << max(distance(i, fa), distance(i, fb)) << endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...