제출 #1332437

#제출 시각아이디문제언어결과실행 시간메모리
1332437rana_azka공장들 (JOI14_factories)C++20
18 / 100
8086 ms123268 KiB
#include "factories.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#pragma GCC optimize(03)
#pragma GCC target("avx2")

const ll INF = 1e18;
const int MAXN = 5e5;
const int MAXLog = log2(MAXN) + 1;

int n, m;
vector<pair<int, ll>> adj[MAXN+5];
int depth[MAXN+5];
ll distRoot[MAXN+5];
int par[MAXLog+5][MAXN+5];

void dfs(int cur){
  for(int i = 1; i <= MAXLog; i++) par[i][cur] = par[i-1][par[i-1][cur]];

  for(auto [next, weight] : adj[cur]){
    if(next == par[0][cur]) continue;

    par[0][next] = cur;
    depth[next] = depth[cur] + 1;
    distRoot[next] = distRoot[cur] + weight;
    dfs(next);
  }
}

int anc(int cur, int up){
  for(int i = 0; i <= MAXLog; i++){
    if(up & (1 << i)) cur = par[i][cur];
  }

  return cur;
}

int lca(int a, int b){
  if(depth[a] > depth[b]) swap(a, b);

  b = anc(b, depth[b] - depth[a]);
  if(a == b) return a;

  for(int i = MAXLog; i >= 0; i--){
    if(par[i][a] == par[i][b]) continue;
    a = par[i][a];
    b = par[i][b];
  }

  return par[0][a];
}

ll dist(int a, int b){
  ll ret = distRoot[a] + distRoot[b] - (2ll * distRoot[lca(a, b)]);
  return ret;
}

void Init(int N, int A[], int B[], int D[]) {
  n = N;
  for(int i = 1; i <= n-1; i++){
    int u = A[i-1] + 1, v = B[i-1] + 1, w = D[i-1];
    adj[u].push_back({v, w});
    adj[v].push_back({u, w});
  }
  
  depth[1] = 1;
  dfs(1);
}

long long Query(int S, int X[], int T, int Y[]) {
  ll ans = INF;

  for(int i = 0; i < S; i++){
    for(int j = 0; j < T; j++){
      int u = X[i] + 1, v = Y[j] + 1;
      // cerr << u << ' ' << v << " : " << dist(u, v) << endl;
      ans = min(dist(u, v), ans);
    }
  }

  return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...