Submission #1196803

#TimeUsernameProblemLanguageResultExecution timeMemory
1196803loomRoadside Advertisements (NOI17_roadsideadverts)C++20
100 / 100
63 ms35400 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define nl '\n'

const int N = 5e4+1, lg = 17;
vector<pair<int,int>> g[N];
int mn[2*N][lg], ix[2*N][lg];
int in[N], dep[N];
int cnt;

void dfs(int v, int p){
   in[v] = cnt;
   mn[cnt][0] = in[v];
   ix[cnt][0] = v;
   cnt++;

   for(auto [ch, w] : g[v]){
      if(ch == p) continue;
      
      dep[ch] = dep[v]+w;
      dfs(ch, v);

      mn[cnt][0] = in[v];
      ix[cnt][0] = v;
      cnt++;
   }
}

void precomp(){
   dfs(0, -1);

   for(int j=1; j<lg; j++){
      for(int i=0; i+(1<<j)-1 < 2*N; i++){
         int l = mn[i][j-1], r = mn[i+(1<<(j-1))][j-1];
         
         mn[i][j] = min(l, r);
         ix[i][j] = (l <= r ? ix[i][j-1] : ix[i+(1<<(j-1))][j-1]);
      }
   }
}

int lca(int x, int y){
   x = in[x];
   y = in[y];
   if(x > y) swap(x, y);

   int lg = log2(y-x+1);
   return (mn[x][lg] <= mn[y-(1<<lg)+1][lg] ? ix[x][lg] : ix[y-(1<<lg)+1][lg]);
}

int dis(int x, int y){
   return dep[y] - dep[x];
}

inline void solve(){
   int n;
   cin>>n;
   for(int i=1; i<n; i++){
      int a, b, w;
      cin>>a>>b>>w;
      g[a].push_back({b, w});
      g[b].push_back({a, w});
   }
   precomp();

   int q;
   cin>>q;
   while(q--){
      vector<int> v(5);
      for(int &i : v) cin>>i;

      int rt = v[0];
      for(int i=1; i<5; i++) rt = lca(rt, v[i]);

      int ans = dis(rt, v[0]);
      for(int i=1; i<5; i++){
         int mn = 1e18;
         for(int j=0; j<i; j++){
            mn = min(mn, dis(lca(v[j], v[i]), v[i]));
         }
         ans += mn;
      }

      cout<<ans<<nl;
   }
}

signed main(){
   ios_base::sync_with_stdio(0);
   cin.tie(NULL);cout.tie(NULL);

   int t = 1;
   //cin>>t;
   while(t--) solve();

   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...