Submission #1255986

#TimeUsernameProblemLanguageResultExecution timeMemory
1255986pastaFactories (JOI14_factories)C++20
0 / 100
27 ms47680 KiB
#include "factories.h"
#include <bits/stdc++.h>

using namespace std;

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



#define pb		push_back
#define all(x)	x.begin(), x.end()
// #define int ll
// #define fast_io     ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

const ll inf = 1e18 + 10;
const int maxn = 1e6 + 10;

ll dist[maxn], sub[maxn];
vector<pii> G[maxn], cent[maxn];
bool dead[maxn];

int dfs_sz(int v, int p) {
	sub[v] = 1;
	for (auto [u, w] : G[v]) {
		if (u == p || dead[u]) continue;
		sub[v] += dfs_sz(u, v);
	}
	return sub[v];
}

int centroid(int v, int p, int sz) {
	for (auto [u, w] : G[v]) {
		if (u == p || dead[u]) continue;
		if (sz < sub[u] * 2)
			return centroid(u, v, sz);
	}
	return v;
}

void add(int v, int p, int tag, int d = 0) {
	cent[v].pb({tag, d});
	for (auto [u, w] : G[v]) {
		if (u == p || dead[u]) continue;
		add(u, v, tag, d + w);
	}
}

void decomp(int v) {
	int cen = centroid(v, 0, dfs_sz(v, 0));
	add(cen, 0, cen);
	for (auto [u, w] : G[v]) {
		if (dead[u]) continue;
		decomp(u);
	}
}


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

ll Query(int S, int X[], int T, int Y[]) {
	for (int i = 0; i < S; i++) {
		for (auto [u, d] : cent[X[i]]) {
			dist[u] = inf;
		}
	}

	for (int i = 0; i < T; i++) {
		for (auto [u, d] : cent[Y[i]]) {
			dist[u] = min(dist[u], d);
		}
	}

	ll ans = inf;
	for (int i = 0; i < S; i++) {
		for (auto [u, d] : cent[X[i]]) {
			ans = min(ans, d + dist[u]);
		}
	}
	return ans;
}

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