Submission #1256667

#TimeUsernameProblemLanguageResultExecution timeMemory
1256667julia_08Factories (JOI14_factories)C++20
0 / 100
2259 ms291472 KiB
#include <bits/stdc++.h>
#include "factories.h"

using namespace std;

using ll = long long;

const int MAXN = 5e5 + 10;
const ll INF = 1e18;

int used[MAXN], sub[MAXN]; 

ll dist[MAXN];

vector<pair<int, ll>> adj[MAXN], ancestors[MAXN];

multiset<int> ms[MAXN];

int get_size(int v, int p){

  sub[v] = 1;

  for(auto [u, w] : adj[v]){
    if(used[u] || u == p) continue;
    sub[v] += get_size(u, v);
  }

  return sub[v];

}

int get_centroid(int v, int p, int sz){

  for(auto [u, w] : adj[v]){
    if(used[u] || u == p) continue;
    if(sub[u] > sz / 2) return get_centroid(u, v, sz);
  }

  return v;

}

void get_dists(int v, int p, int c){

  for(auto [u, w] : adj[v]){
    if(used[u] || u == p) continue;
    dist[u] = dist[v] + w;
    get_dists(u, v, c);
  }

  ancestors[v].push_back({c, dist[v]});

}

void build(int v, int p){

  int c = get_centroid(v, p, get_size(v, p));

  used[c] = 1;
  dist[c] = 0;

  get_dists(c, c, c);

  for(auto [u, w] : adj[c]){
    if(used[u]) continue;
    build(u, c);
  }

}

void paint(int v, int x){

  for(auto [c, d] : ancestors[v]){
    if(x == 1){
      ms[c].insert(d);
    } else ms[c].erase(ms[c].find(d));
  }

}

ll query(int v){

  ll r = INF;

  for(auto [c, d] : ancestors[v]){
    if(!ms[c].empty()){
      r = min(r, d + *ms[c].begin());
    }
  }

  return r;

}

void Init(int n, int a[], int b[], int d[]){

  for(int i=0; i<(n - 1); i++){
    adj[a[i]].push_back({b[i], d[i]});
    adj[b[i]].push_back({a[i], d[i]});
  }

  build(0, 0);

}

ll Query(int s, int x[], int t, int y[]){

  for(int i=0; i<s; i++) paint(x[i], 1);

  ll ans = INF;

  for(int i=0; i<t; i++) ans = min(ans, query(y[i]));

  for(int i=0; i<s; i++) paint(x[i], -1);

  return ans;

}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...