Submission #362585

#TimeUsernameProblemLanguageResultExecution timeMemory
362585wind_reaperRoadside Advertisements (NOI17_roadsideadverts)C++17
7 / 100
51 ms9768 KiB
#include <bits/stdc++.h> using namespace std; vector<vector<pair<int, int>>> adj; struct LCA{ vector<vector<int>> up; int l; vector<int> tin, tout, depth; LCA(int n){ l = 32 - __builtin_clz(n); up.resize(l+1, vector<int>(n)); tin.resize(n); tout.resize(n); depth.resize(n); dfs(0, 0, 0); } int timer = 0; void dfs(int node, int par, int W){ tin[node] = timer++; depth[node] = depth[par] + W; up[0][node] = par; for(int i = 1; i <= l; i++) up[i][node] = up[i-1][up[i-1][node]]; for(auto&[v, w] : adj[node]){ if(v == par) continue; dfs(v, node, w); } tout[node] = timer++; } bool isAncestor(int u, int v){ return tin[u] <= tin[v] && tout[u] >= tout[v]; } int lca(int u, int v){ if(isAncestor(u, v)) return u; if(isAncestor(v, u)) return v; for(int i = l; i >= 0; --i) if(!isAncestor(up[i][u], v)) u = up[i][u]; return up[0][u]; } int dist(int u, int v){ int L = lca(u, v); return depth[u] + depth[v] - 2*depth[L]; } }; int32_t main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); int n; cin >> n; adj.resize(n); for(int i = 0; i < n-1; i++){ int u, v, w; cin >> u >> v >> w; adj[u].emplace_back(v, w); adj[v].emplace_back(u, w); } LCA d(n); int Q; cin >> Q; for(int _ = 0; _ < Q; _++){ vector<int> q(5); for(int i = 0; i < 5; i++) cin >> q[i]; int ans = 0; for(int i = 0; i < 5; i++){ int w = d.dist(d.lca(q[(i+4)%5], q[i]), q[i]); // cout << q[(i+4)%5] << ' ' << q[i] << ' ' << w << '\n'; ans += w; } cout << ans << '\n'; } 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...