Submission #1203462

#TimeUsernameProblemLanguageResultExecution timeMemory
1203462vicvicRoadside Advertisements (NOI17_roadsideadverts)C++20
100 / 100
159 ms23100 KiB
#include <bits/stdc++.h> #define int long long using namespace std; ifstream f ("test.in"); ofstream g ("test.out"); const int NMAX=1e5, LGMAX=17; vector <pair <int, int>> vec[NMAX+5]; int n; int t[NMAX+5][LGMAX+2], sum[NMAX+5][LGMAX+2], v[NMAX+5], depth[NMAX+5]; void dfs (int nod, int tatal=0, int w=0) { t[nod][0]=tatal; depth[nod]=depth[tatal]+1; sum[nod][0]=w; for (int i=1;i<=LGMAX;i++) { t[nod][i]=t[t[nod][i-1]][i-1]; sum[nod][i]=sum[nod][i-1]+sum[t[nod][i-1]][i-1]; } for (auto adj : vec[nod]) { if (adj.first==tatal) continue; dfs (adj.first, nod, adj.second); } } pair <int, int> LCA (int x, int y) { if (x==y) return {x, 0}; int cost=0; if (depth[x]>depth[y]) swap (x, y); for (int i=LGMAX;i>=0;i--) if (t[y][i]!=0 && depth[t[y][i]]>=depth[x]) cost+=sum[y][i], y=t[y][i]; if (x==y) return {x, cost}; for (int i=LGMAX;i>=0;i--) if (t[y][i]!=0 && t[y][i]!=t[x][i]) cost+=sum[x][i], cost+=sum[y][i], x=t[x][i], y=t[y][i]; return {t[x][0], cost+t[x][0]+t[y][0]}; } int32_t main () { ios_base :: sync_with_stdio (0); cin.tie (nullptr); cin >> n; for (int i=1;i<n;i++) { int x, y, w; cin >> x >> y >> w; x++; y++; vec[x].push_back ({y, w}); vec[y].push_back ({x, w}); } dfs (1); int q; cin >> q; while (q--) { int glob_lca=0; for (int i=0;i<5;i++) { cin >> v[i]; v[i]++; glob_lca=(glob_lca==0?v[i]:LCA (glob_lca, v[i]).first); } int cost=0; for (int msk=1;msk<(1 << 5);msk++) { int crt_lca=0; for (int i=0;i<5;i++) { if (msk & (1 << i)) crt_lca=(crt_lca==0?v[i]:LCA (crt_lca, v[i]).first); } cost+=LCA (crt_lca, glob_lca).second*(__builtin_popcount (msk)%2==0?-1:1); } cout << cost << "\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...