Submission #1230842

#TimeUsernameProblemLanguageResultExecution timeMemory
1230842ballsFactories (JOI14_factories)C++20
100 / 100
1500 ms116620 KiB
#include "factories.h"
#include<bits/stdc++.h>
using namespace std;

const int MaxN = 5e5 + 7;
const int Log = 20;
int dfn[MaxN], dfst, efn[MaxN], prt[Log][MaxN], dep[MaxN], c[1000005], xyzzzz[500005], cnt, pv;
long long d[MaxN], res;

vector<pair<int, int>> adj[MaxN];

void dfssss(int x, int p) {
	dfn[x] = ++dfst;
	for (auto i : adj[x]) {
		if (i.second == p) {
		    continue;
		}
		dep[dfst + 1] = dep[dfn[x]] + 1;
		d[dfst + 1] = d[dfn[x]] + i.first;
		prt[0][dfst + 1] = dfn[x];
		dfssss(i.second, x);
	}
	efn[dfn[x]] = dfst;
}

pair<long long, long long> dfs(int x) {
	long long s = 1e18, t = 1e18;
	if (xyzzzz[x] == 1) {
	    s = 0;
	}
	if (xyzzzz[x] == 2) {
	    t = 0;
	}
	xyzzzz[x] = 0;
	while (pv < cnt && c[pv] <= efn[x]) {
		int i = c[pv++];
		auto pr = dfs(i);
		s = min(s, pr.first + d[i] - d[x]);
		t = min(t, pr.second + d[i] - d[x]);
	}
	res = min(res, s + t);
	return {s, t};
}

int lca(int s, int e) {
	if (dep[s] < dep[e]) {
	    swap(s, e);
	}
	for (int i = 18; i >= 0; i--) {
		if ((dep[s] - dep[e] >> i) & 1) {
		    s = prt[i][s];
		}
	}
	if (s == e) {
	    return s;
	}
	for (int i = 18; i >= 0; i--) {
		if (prt[i][s] != prt[i][e]) {
		    s = prt[i][s];
		    e = prt[i][e];
		}
	}
	return prt[0][s];
}

void Init(int N, int A[], int B[], int D[]) {
	for (int i = 0; i < N - 1; i++) {
		adj[A[i]].push_back({D[i], B[i]});
		adj[B[i]].push_back({D[i], A[i]});
	}
	dfssss(0, 0);
	for (int i = 1; i < 19; i++) {
	    for (int j = 1; j <= N; j++) {
	        prt[i][j] = prt[i - 1][prt[i - 1][j]];
	    }
	}
}

long long Query(int S, int X[], int T, int Y[]) {
	cnt = 0;
	for (int i = 0; i < S; i++) {
	    c[cnt] = dfn[X[i]];
	    xyzzzz[c[cnt++]] = 1;
	}
	for (int i = 0; i < T; i++) {
	    c[cnt] = dfn[Y[i]], xyzzzz[c[cnt++]] = 2;
	}
	sort(c, c + cnt);
	for (int i = cnt - 1; i >= 1; i--) {
	    c[cnt++] = lca(c[i - 1], c[i]);
	}
	sort(c, c + cnt);
	cnt = unique(c, c + cnt) - c;
	res = 1e18;
	pv = 0;
	dfs(1);
	return res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...