제출 #1341921

#제출 시각아이디문제언어결과실행 시간메모리
1341921kawhietFactories (JOI14_factories)C++20
15 / 100
3698 ms568160 KiB
#include <bits/stdc++.h>
#include "factories.h"
using namespace std;

constexpr int N = 5e5 + 5;
constexpr long long inf = 1e18;

vector<pair<int, int>> g[N];
int sz[N];
bool deleted[N];

void dfs_size(int u, int p) {
  sz[u] = 1;
  for (auto [v, w] : g[u]) {
    if (v != p && !deleted[v]) {
      dfs_size(v, u);
      sz[u] += sz[v];
    }
  }
}

int find_centroid(int u, int p, int n) {
  for (auto [v, w] : g[u]) {
    if (v != p && !deleted[v] && sz[v] * 2 > n) {
      return find_centroid(v, u, n);
    }
  }
  return u;
}

map<int, long long> down[N];
vector<pair<int, long long>> f[N];

void dfs(int u, int p, long long d, int c) {
  f[u].push_back({c, d});
  if (!down[c].count(u)) {
    down[c][u] = d;
  } else {
    down[c][u] = min(down[c][u], d);
  }
  for (auto [v, w] : g[u]) {
    if (!deleted[v] && v != p) {
      dfs(v, u, d + w, c);
    }
  }
}

void go(int u) {
  dfs_size(u, -1);
  int r = find_centroid(u, -1, sz[u]);
  deleted[r] = 1;
  dfs(r, -1, 0, r);
  for (auto [v, w] : g[r]) {
    if (!deleted[v]) {
      go(v);
    }
  }
}

map<int, long long> dp;

void Init(int N, int A[], int B[], int D[]) {
  for (int i = 0; i < N - 1; i++) {
    g[A[i]].push_back({B[i], D[i]});
    g[B[i]].push_back({A[i], D[i]});
  }
  go(0);
}

long long Query(int S, int X[], int T, int Y[]) {
  dp.clear();
  for (int i = 0; i < S; i++) {
    int u = X[i];
    for (auto [c, d] : f[u]) {
      if (!dp.count(c)) {
        dp[c] = d;
      } else {
        dp[c] = min(dp[c], d);
      }
    }
  }
  long long ans = inf;
  for (int i = 0; i < T; i++) {
    int u = Y[i];
    for (auto [c, d] : f[u]) {
      if (dp.count(c)) {
        ans = min(ans, dp[c] + d);
      }
    }
  }
  return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...