답안 #256133

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
256133 2020-08-02T10:12:51 Z islingr 공장들 (JOI14_factories) C++17
0 / 100
350 ms 524292 KB
#include <bits/stdc++.h>
using namespace std;

#define rep(i, a, b) for (auto i = (a); i < (b); ++i)
#define per(i, a, b) for (auto i = (b); i-- > (a); )
#define sz(x...) int((x).size())
#define all(x) begin(x), end(x)
#define eb(x...) emplace_back(x)

template<class T> bool ckmin(T &a, const T &b) { return a > b ? a = b, 1 : 0; }

using ll = int64_t;

const ll inf = 1e18;
const int B = 19, N = 1 << B;
int dep[N], p[N][B], in[N];
ll dist[N];

void Init(int n, int a[], int b[], int d[]) {
	vector<vector<int>> g(n);
	rep(e, 0, n - 1) g[a[e]].eb(e), g[b[e]].eb(e);
	int timer = 0;
	function<void(int)> dfs = [&](int u) {
		in[u] = timer++;
		for (int e : g[u]) {
			int v = u != a[e] ? a[e] : b[e];
			if (v == p[u][0]) continue;
			dist[v] = dist[u] + d[e];
			dep[v] = dep[u] + 1;
			p[v][0] = u;
			rep(j, 0, B - 1) p[v][j + 1] = p[p[v][j]][j];
			dfs(v);
		}
	};
	dfs(0);
}

int lca(int u, int v) {
	if (dep[u] < dep[v]) swap(u, v);
	per(j, 0, B) if (dep[v] <= dep[p[u][j]]) u = p[u][j];
	if (u == v) return u;
	per(j, 0, B) if (p[u][j] != p[v][j]) u = p[u][j], v = p[v][j];
	return p[u][0];
}

vector<int> g[N];
short col[N];
ll s[N], t[N];

ll Query(int S, int X[], int T, int Y[]) {
	vector<int> V; V.reserve(2 * (S + T));
	rep(i, 0, S) col[X[i]] = +1, V.eb(X[i]);
	rep(i, 0, T) col[Y[i]] = -1, V.eb(Y[i]);
	auto cmp = [&](int x, int y) { return in[x] < in[y]; };
	sort(all(V), cmp);
	rep(i, 1, S + T) V.eb(lca(V[i - 1], V[i]));
	sort(all(V), cmp);
	// V.erase(unique(all(V), cmp), end(V));
	rep(i, 1, sz(V)) g[lca(V[i - 1], V[i])].eb(V[i]);
	ll ans = inf;
	function<void(int)> dfs = [&](int u) {
		s[u] = t[u] = inf;
		if (col[u] > 0) s[u] = 0;
		if (col[u] < 0) t[u] = 0;
		for (int v : g[u]) {
			dfs(v);
			ckmin(s[u], dist[v] - dist[u] + s[v]);
			ckmin(t[u], dist[v] - dist[u] + t[v]);
		}
		ckmin(ans, s[u] + t[u]);
	};
	dfs(V[0]);
	for (int v : V) g[v].clear(), col[v] = 0;
	return ans;
}
# 결과 실행 시간 메모리 Grader output
1 Runtime error 350 ms 524292 KB Execution killed with signal 9 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 330 ms 524292 KB Execution killed with signal 9 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 350 ms 524292 KB Execution killed with signal 9 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -