제출 #1147064

#제출 시각아이디문제언어결과실행 시간메모리
1147064LuvidiRoadside Advertisements (NOI17_roadsideadverts)C++20
7 / 100
1093 ms9284 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define pll pair<ll, ll> #define pii pair<int, int> #define fs first #define sc second #define pb push_back const int maxn=5e4; vector<pii> adj[maxn]; int dp[maxn],up[maxn][20]; ll d[maxn]; void dfs(int v,int p){ up[v][0]=p; for(auto[u,w]:adj[v])if(u!=p){ d[u]=d[v]+w; dp[u]=dp[v]+1; dfs(u,v); } } int lca(int u,int v){ if(dp[u]<dp[v])swap(u,v); for(int i=19;i>-1;i--)if(dp[u]-(1<<i)>=dp[v])u=up[u][i]; if(u==v)return u; for(int i=19;i>-1;i--)if(up[u][i]!=up[v][i])u=up[u][i],v=up[v][i]; return up[u][0]; } int dist(int u,int v){ return d[u]+d[v]-2*d[lca(u,v)]; } void solve() { int n; cin>>n; for(int i=0;i<n-1;i++){ int u,v,w; cin>>u>>v>>w; adj[u].pb({v,w}); adj[v].pb({u,w}); } dfs(0,0); for(int x=1;x<20;x++){ for(int i=0;i<n;i++)up[i][x]=up[up[i-1][x-1]][x-1]; } int q; cin>>q; while(q--){ int a[5]; for(int i=0;i<5;i++)cin>>a[i]; int ans=0; for(int i=0;i<n;i++){ for(auto[j,w]:adj[i])if(i<j){ bool b=0; for(int x=0;x<5;x++){ for(int y=0;y<5;y++){ b|=dist(a[x],i)+w+dist(j,a[y])==dist(a[x],a[y]); } } if(b)ans+=w; } } cout<<ans<<'\n'; } } int main() { #ifdef FPO freopen("in","r",stdin); freopen("out","w",stdout); #endif ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...