Submission #1311377

#TimeUsernameProblemLanguageResultExecution timeMemory
1311377NomioFactories (JOI14_factories)C++20
100 / 100
3100 ms342172 KiB
#include<bits/stdc++.h>
#include "factories.h"
#define s second
#define f first
#define pii pair<int, long long>

using namespace std;
using ll = long long;
const int maxn = 5e5 + 1;

bool removed[maxn] {};
int sz[maxn] {};
vector<pii> adj[maxn];

int get_sz(int u, int p) {
	sz[u] = 1;
	for(pii P : adj[u]) {
		int v = P.f;
		if(removed[v] || v == p) continue;
		sz[u] += get_sz(v, u);
	}
	return sz[u];
}

int get_centroid(int u, int p, int sze) {
	for(pii P : adj[u]) {
		int v = P.f;
		if(removed[v] || v == p) continue;
		if(sz[v] > sze / 2) return get_centroid(v, u, sze);
	}
	return u;
}

vector<pii> anc[maxn];

void get_dist(int u, int p, int cent, ll dist) {
	for(pii P : adj[u]) {
		int v = P.f;
		ll w = P.s;
		if(removed[v] || v == p) continue;
		get_dist(v, u, cent, dist + w);
	}
	anc[u].push_back({cent, dist});
}

int build_centroid(int u) {
	get_sz(u, -1);
	int center = get_centroid(u, -1, sz[u]);
	removed[center] = 1;
	anc[center].push_back({center, 0});
	for(pii P : adj[center]) {
		int v = P.f;
		ll w = P.s;
		if(removed[v]) continue;
		get_dist(v, center, center, w);
	}
	for(pii P : adj[center]) {
		int v = P.f;
		if(removed[v]) continue;
		build_centroid(v);
	}
	return center;
}

vector<ll> dist(maxn, 1e18);

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], 1LL * D[i]});
		adj[B[i]].push_back({A[i], 1LL * D[i]});
	}
	int center = build_centroid(0);
}

long long Query(int S, int X[], int T, int Y[]) {
	ll ans = 1e18;
	for(int i = 0; i < S; i++) {
		for(pii P : anc[X[i]]) {
			int v = P.f;
			ll w = P.s;
			dist[v] = 1e18;
		}
	}
	for(int i = 0; i < T; i++) {
		for(pii P : anc[Y[i]]) {
			int v = P.f;
			ll w = P.s;
			dist[v] = min(dist[v], w);
		}
	}
	for(int i = 0; i < S; i++) {
		for(pii P : anc[X[i]]) {
			int v = P.f;
			ll w = P.s;
			ans = min(ans, dist[v] + w);
		}
	}
	return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...