Submission #340002

# Submission time Handle Problem Language Result Execution time Memory
340002 2020-12-26T14:57:22 Z penguinhacker Factories (JOI14_factories) C++14
0 / 100
8000 ms 524292 KB
#include <bits/stdc++.h>
#include "factories.h"
using namespace std;

#define ll long long
#define ar array

const int mxN = 500000;
int n, sz[mxN];
ll best[mxN];
bool dead[mxN];
vector<pair<int, int>> adj[mxN];
vector<pair<int, ll>> par[mxN];

int dfs_sz(int u, int p) {
	sz[u] = 1;
	for (pair<int, int>& v : adj[u]) if (v.first != p && !dead[v.first])
		sz[u] += dfs_sz(v.first, u);
	return sz[u];
}

int get_centroid(int u, int p, int tsz) {
	for (pair<int, int>& v : adj[u]) if (v.first != p && !dead[v.first])
		return get_centroid(v.first, u, tsz);
	return u;
}

void dfs(int u, int p, int c, ll d) {
	par[u].emplace_back(c, d);
	for (pair<int, int>& v : adj[u]) if (v.first != p && !dead[v.first])
		dfs(v.first, u, c, d + v.second);
}

void centroid(int u = 0) {
	u = get_centroid(u, -1, dfs_sz(u, -1));
	dfs(u, -1, u, 0);
	dead[u] = 1;
	for (pair<int, int> v : adj[u]) if (!dead[v.first])
		centroid(v.first);
	dead[u] = 0;
}

void Init(int N, int A[], int B[], int D[]) {
	n = N;
	for (int i = 0; i < n - 1; ++i) {
		int a = A[i], b = B[i], d = D[i];
		adj[a].emplace_back(b, d);
		adj[b].emplace_back(a, d);
	}
	centroid();
	fill(best, best + n, 1e18);
}

ll Query(int S, int X[], int T, int Y[]) {
	vector<int> rb; // rollback best array
	for (int i = 0; i < S; ++i) {
		int u = X[i];
		for (pair<int, ll> p : par[u]) {
			best[p.first] = min(best[p.first], p.second);
			rb.push_back(p.first);
		}
	}
	ll ans = 1e18;
	for (int i = 0; i < T; ++i) {
		int u = Y[i];
		for (pair<int, ll> p : par[u])
			ans = min(ans, best[p.first] + p.second);
	}
	for (int i : rb)
		best[i] = 1e18;
	assert(ans < (ll)1e18);
	return ans;
}

/*int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	int n, q; cin >> n >> q;
	int a[n - 1], b[n - 1], d[n - 1];
	for (int i = 0; i < n - 1; ++i)
		cin >> a[i] >> b[i] >> d[i];
	Init(n, a, b, d);
	for (int i = 0; i < q; ++i) {
		int s, t; cin >> s >> t;
		int x[s], y[t];
		for (int j = 0; j < s; ++j)
			cin >> x[j];
		for (int j = 0; j < t; ++j)
			cin >> y[j];
		cout << Query(s, x, t, y) << "\n";
	}
	return 0;
}
*/
# Verdict Execution time Memory Grader output
1 Correct 90 ms 27572 KB Output is correct
2 Execution timed out 8093 ms 317800 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 30 ms 26860 KB Output is correct
2 Runtime error 7761 ms 524292 KB Execution killed with signal 9 (could be triggered by violating memory limits)
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 90 ms 27572 KB Output is correct
2 Execution timed out 8093 ms 317800 KB Time limit exceeded
3 Halted 0 ms 0 KB -