Submission #1152955

#TimeUsernameProblemLanguageResultExecution timeMemory
1152955tht2005공장들 (JOI14_factories)C++17
100 / 100
2073 ms150492 KiB
#include "factories.h"
#include <bits/stdc++.h>

using namespace std;

typedef pair<int, int> pi;
typedef long long ll;

const int N = (int)5e5 + 10;
const int L = 19;

int type[N];
ll res, f[N][2];
vector< pair<ll, int> > virt_aj[N];
void dfs2(int v) {
  f[v][0] = f[v][1] = 1LL<<60;
  if(type[v] != -1) {
    f[v][type[v]] = 0;
  }
  for(const pair<ll, int>& tmp : virt_aj[v]) {
    ll w = tmp.first;
    int u = tmp.second;
    dfs2(u);
    res = min(res,
                min(f[u][0] + w + f[v][1], f[u][1] + w + f[v][0]));
    for(int t = 2; t--; ) {
      f[v][t] = min(f[v][t], f[u][t] + w);
    }
  }
}

int timer=0, tin[N], tout[N], par[N][L];
ll sum[N];
vector<pi> aj[N];

void dfs(int v, int p=-1) {
  tin[v] = timer++;
  memset(par[v], -1, sizeof(par[v]));
  par[v][0] = p;
  for(int i = 0; i + 1 < L && par[v][i] != -1; ++i) {
    par[v][i + 1] = par[par[v][i]][i];
  }
  for(const pi& x : aj[v]) {
    int u = x.second;
    if(u == p) {
      continue;
    }
    sum[u] = sum[v] + x.first;
    dfs(u, v);
  }
  tout[v] = timer;
}

bool anc(int p, int c) {
  return tin[p] <= tin[c] && tin[c] < tout[p];
}
int lca(int u, int v) {
  if(anc(u, v)) return u;
  if(anc(v, u)) return v;
  for(int i = L; i--; ) {
    if(par[v][i] != -1 && !anc(par[v][i], u)) {
      v = par[v][i];
    }
  }
  return par[v][0];
}

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

long long Query(int S, int X[], int T, int Y[]) {
  vector<pi> ord;
  for(int i = 0; i < S; ++i)
    ord.emplace_back(tin[X[i]], X[i]);
  for(int i = 0; i < T; ++i)
    ord.emplace_back(tin[Y[i]], Y[i]);
  sort(ord.begin(), ord.end());
  for(int i = 0, sz = ord.size(); i + 1 < sz; ++i) {
    int x = lca(ord[i].second, ord[i + 1].second);
    ord.emplace_back(tin[x], x);
  }
  sort(ord.begin(), ord.end());
  ord.erase(unique(ord.begin(), ord.end()), ord.end());
  for(const pi& tmp : ord) {
    virt_aj[tmp.second].clear();
    type[tmp.second] = -1;
  }
  for(int i = 0; i < S; ++i) {
    type[X[i]] = 0;
  }
  for(int i = 0; i < T; ++i) {
    type[Y[i]] = 1;
  }
  stack<int> stk;
  for(const pi& tmp : ord) {
    int c = tmp.second;
    while(!stk.empty() && !anc(stk.top(), c)) {
      stk.pop();
    }
    if(!stk.empty()) {
      int r = stk.top();
      virt_aj[r].emplace_back(sum[c] - sum[r], c);
    }
    stk.push(c);
  }
  int root = ord.front().second;
  res = 1LL<<60;
  dfs2(root);
  return res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...