Submission #1341924

#TimeUsernameProblemLanguageResultExecution timeMemory
1341924kawhietFactories (JOI14_factories)C++20
100 / 100
3709 ms339512 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;
}

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

void dfs(int u, int p, long long d, int c) {
  f[u].push_back({c, 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);
    }
  }
}

long long dp[N];

void Init(int N, int A[], int B[], int D[]) {
  fill(dp, dp + N, inf);
  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[]) {
  vector<int> pos;
  for (int i = 0; i < S; i++) {
    int u = X[i];
    for (auto [c, d] : f[u]) {
      pos.push_back(c);
      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]) {
      ans = min(ans, dp[c] + d);
    }
  }
  for (auto i : pos) {
    dp[i] = inf;
  }
  return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...