Submission #1332429

#TimeUsernameProblemLanguageResultExecution timeMemory
1332429nathjessFactories (JOI14_factories)C++20
0 / 100
8093 ms142352 KiB
# include "factories.h"
# include <bits/stdc++.h>
# define ll long long 
# define vi vector<int>
# define pb push_back
# define pii pair<int, int>
# define fi first
# define se second

using namespace std;

ll n, a[500005], b[500005], d[500005], par[20][500005];
ll dist[500005], ans, dep[500005];
vector<pii> adj[500005];

void dfs(int x, int p) {
  for(auto i : adj[x]) {
    if(i.fi==p) continue;
    par[0][i.fi]=x;
    dep[i.fi]=dep[x]+1;
    dist[i.fi]=dist[x]+i.se;
    dfs(i.fi, x);
  }
}

void build() {
  for(int i=1; i<=19; i++ ){
    for(int j=0; j<n; j++) {
      par[i][j]=par[i-1][par[i-1][j]];
    }
  }
}

int lca(int a, int b) {
  if(dep[a]>dep[b]) swap(a, b);
  for(int i=19; i>=0; i--) {
    if(dep[par[i][b]]>=dep[a]) {
      b=par[i][b];
    }
  }
  if(a==b) return a;
  for(int i=19; i>=0; i--) {
    if(par[i][a]!=par[i][b]) {
      a=par[i][a];
      b=par[i][b];
    }
  }
  return par[0][a];
}

void Init(int N, int A[], int B[], int D[]) {
  n=N;
  for(int i=1; i<n; i++) a[i]=A[i-1], b[i]=B[i-1], d[i]=D[i-1];
  for(int i=1; i<n; i++) {
    adj[a[i]].pb({b[i], d[i]});
    adj[b[i]].pb({a[i], d[i]});
  }
  par[0][0]=-1;
  dfs(0, -1);
  build();
} 

long long Query(int S, int X[], int T, int Y[]) {
  ans=1e14;
  for(int i=0; i<S; i++) {
    for(int j=0; j<T; j++) {
      int tmp=lca(X[i], Y[j]);
      // cout << "tmp " << X[i] << " " << Y[j] << " : " << tmp << endl;
      ans=min(ans, (ll)dist[X[i]]+dist[Y[j]]-dist[tmp]*2LL);
    }
  }
  return ans;
}
 
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...