Submission #987860

#TimeUsernameProblemLanguageResultExecution timeMemory
987860AcanikolicRoadside Advertisements (NOI17_roadsideadverts)C++14
100 / 100
51 ms15808 KiB
#include <bits/stdc++.h> #define pb push_back #define S second #define F first const int N = 1e5 + 10; const int inf = 2e9; const int lg = 17; using namespace std; vector<pair<int,int>>g[N]; int up[N][lg],in[N],out[N],timer = 0,dist[N]; void dfs(int x,int par) { in[x] = ++timer; if(par != -1) up[x][0] = par; if(par != -1) for(int j = 1; j < lg; j++) up[x][j] = up[up[x][j - 1]][j - 1]; for(auto X : g[x]) { if(X.F == par) continue; dist[X.F] = dist[x] + X.S; dfs(X.F,x); } out[x] = timer; } bool intree(int u,int v) { return (in[u] <= in[v] && out[u] >= out[v]); } int lca(int u,int v) { if(intree(u,v)) return u; if(intree(v,u)) return v; for(int j = lg - 1; j >= 0; j--) { if(up[u][j] > 0 && !intree(up[u][j],v)) u = up[u][j]; } return up[u][0]; } bool cmp(int A,int B) { return (in[A] <= in[B]); } signed main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int n; cin >> n; for(int i = 1; i < n; i++) { int u,v,w; cin >> u >> v >> w; g[u].pb({v,w}); g[v].pb({u,w}); } dfs(0,-1); int q; cin >> q; while(q--) { vector<int>vec; for(int i = 0; i < 5; i++) { int X; cin >> X; vec.pb(X); } sort(vec.begin(),vec.end(),cmp); vec.pb(vec[0]); int res = 0; for(int i = 0; i < 5; i++) { res += dist[vec[i]]; res -= dist[lca(vec[i],vec[i + 1])]; } cout << res << "\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...