Submission #1193142

#TimeUsernameProblemLanguageResultExecution timeMemory
1193142mannshah1211Factories (JOI14_factories)C++17
100 / 100
2591 ms321764 KiB
#include "factories.h"
#include <bits/stdc++.h>

using namespace std;

vector<vector<pair<int, int>>> g;
vector<int> sub;
vector<bool> alive;
vector<vector<pair<int, long long>>> ancs;
vector<long long> mn;

const long long inf = (long long) 1e18;

int dfs(int v, int pr) {
  sub[v] = 1;
  for (auto [u, w] : g[v]) {
    if (u != pr && alive[u]) {
      sub[v] += dfs(u, v);
    }
  }
  return sub[v];
}

int find(int v, int pr, int sz) {
  for (auto [u, w] : g[v]) {
    if (u != pr && alive[u] && 2 * sub[u] > sz) {
      return find(u, v, sz);
    }
  }
  return v;
}

void distance(int v, int pr, int centroid, long long cur) {
  for (auto [u, w] : g[v]) {
    if (u != pr && alive[u]) {
      distance(u, v, centroid, cur + w);
    }
  }
  ancs[v].push_back(make_pair(centroid, cur));
}

void build(int v) {
  int centroid = find(v, -1, dfs(v, -1));
  for (auto [u, w] : g[centroid]) {
    if (alive[u]) {
      distance(u, centroid, centroid, w);
    }
  }
  alive[centroid] = false;
  for (auto [u, w] : g[centroid]) {
    if (alive[u]) {
      build(u);
    }
  }
}

vector<int> modified;

void paint(int v) {
  for (auto [anc, d] : ancs[v]) {
    mn[anc] = min(mn[anc], d);
    modified.push_back(anc);
  }
  mn[v] = 0;
  modified.push_back(v);
}

long long query(int v) {
  long long ans = mn[v];
  for (auto [anc, d] : ancs[v]) {
    ans = min(ans, mn[anc] + d);
  }
  return ans;
}

void reset() {
  for (int v : modified) {
    mn[v] = inf;
  }
  modified.clear();
}

void Init(int n, int a[], int b[], int d[]) {
  g.resize(n);
  for (int i = 0; i < n - 1; i++) {
    g[a[i]].emplace_back(b[i], d[i]);
    g[b[i]].emplace_back(a[i], d[i]);
  }
  sub.resize(n);
  alive.assign(n, true);
  ancs.resize(n);
  build(0);
  mn.assign(n, inf);
}

long long Query(int s, int x[], int t, int y[]) {
  for (int i = 0; i < s; i++) {
    paint(x[i]);
  }
  long long ans = inf;
  for (int i = 0; i < t; i++) {
    ans = min(ans, query(y[i]));
  }
  reset();
  return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...