답안 #821782

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
821782 2023-08-11T16:23:41 Z OAleksa 공장들 (JOI14_factories) C++14
15 / 100
553 ms 87972 KB
#include <bits/stdc++.h>
#include "factories.h"
#define f first
#define s second
using namespace std; 
const int maxn = 1e5 + 69;
const int lg = 18;
int up[maxn][lg];
int timer, tin[maxn], tout[maxn], sz[maxn], par[maxn], vis[maxn];
vector<pair<int, int>> g[maxn];
const long long inf = 1e18;
vector<long long> d(maxn, inf), dis(maxn);
void find_sz(int v, int p) {
	if(vis[v]) {
		sz[v] = 0;
		return;
	}
	sz[v] = 1;
	for(auto u : g[v]) {
		if(u.f != p) {
			find_sz(u.f, v);
			sz[v] += sz[u.f];
		}
	}
}

int find_cen(int v, int p, int n) {
	for(auto u : g[v]) {
		if(u.f != p && !vis[u.f] && sz[u.f] > n / 2)
			return find_cen(u.f, v, n);
	}
	return v;
}

void dfs(int v, int p) {
	find_sz(v, -1);
	int c = find_cen(v, -1, sz[v]);
	par[c] = p;
	vis[c] = 1;
	for(auto u : g[c]) {
		if(!vis[u.f])
			dfs(u.f, c);
	}
}

bool is_anc(int v,int u) {
	return tin[v] <= tin[u] && tout[v] >= tout[u];
}

int lca(int a, int b) {
	if(is_anc(a, b))
		return a;
	else if(is_anc(b, a))
		return b;
	for(int i = lg - 1;i >= 0;i--) {
		if(!is_anc(up[a][i], b) && up[a][i] != -1)
			a = up[a][i];
	}
	return up[a][0];
}

long long dist(int a, int b) {
	int lc = lca(a, b);
	return dis[a] + dis[b] - 2ll * dis[lc];
}

void dfs1(int v,int p) {
	tin[v] = ++timer;
	up[v][0] = p;
	for(int i = 1;i < lg;i++)
		up[v][i] = up[up[v][i - 1]][i - 1];
	for(auto u : g[v]) {
		if(u.f != p) {
			dis[u.f] = dis[v] + u.s;
			dfs1(u.f, v);
		}
	}
	tout[v] = timer;
}

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


long long Query(int S, int X[], int T, int Y[]) {
 	for(int i = 0;i < S;i++)
  		d[X[i]] = 0;
  	long long ans = inf;
	for(int i = 0;i < S;i++) {
		int t = X[i], y = X[i];
		while(y != -1) {
			d[y] = min(d[y], dist(t, y));
			y = par[y];
		}
	}
	for(int i = 0;i < T;i++) {
		int t = Y[i], c = Y[i];
		while(c != -1) {
			ans = min(ans, dist(c, t) + d[c]);
			c = par[c];
		}
	}
	for(int i = 0;i < S;i++) {
		int y = X[i];
		while(y != -1) {
			d[y] = inf;
			y = par[y];
		}
	}
	return ans;
}



// signed main()
// {
	// ios_base::sync_with_stdio(false);
	// cin.tie(0);
	// cout.tie(0);
	// int tt = 1;
	// //cin >> tt;
	// while(tt--) {
		// int n, q;
		// cin >> n >> q;
		// int a[n - 1], b[n - 1], c[n - 1];
		// for(int i = 0;i < n - 1;i++)
			// cin >> a[i] >> b[i] >> c[i];
		// Init(n, a, b, c);
		// for(int i = 0;i < q;i++) {
			// int s, t;
			// cin >> s >> t;
			// int x[s];
			// for(int j = 0;j < s;j++)
				// cin >> x[j];
			// int y[t];
			// for(int j = 0;j < t;j++)
				// cin >> y[j];
			// cout << Query(s, x, t, y) << "\n";
		// }
	// }
   // return 0;
// }
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 4816 KB Output is correct
2 Correct 304 ms 14244 KB Output is correct
3 Correct 553 ms 14224 KB Output is correct
4 Correct 529 ms 14180 KB Output is correct
5 Correct 408 ms 14488 KB Output is correct
6 Correct 155 ms 14160 KB Output is correct
7 Correct 529 ms 14216 KB Output is correct
8 Correct 547 ms 14352 KB Output is correct
9 Correct 414 ms 14488 KB Output is correct
10 Correct 157 ms 14268 KB Output is correct
11 Correct 518 ms 14172 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 4436 KB Output is correct
2 Runtime error 353 ms 87972 KB Execution killed with signal 11
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 4816 KB Output is correct
2 Correct 304 ms 14244 KB Output is correct
3 Correct 553 ms 14224 KB Output is correct
4 Correct 529 ms 14180 KB Output is correct
5 Correct 408 ms 14488 KB Output is correct
6 Correct 155 ms 14160 KB Output is correct
7 Correct 529 ms 14216 KB Output is correct
8 Correct 547 ms 14352 KB Output is correct
9 Correct 414 ms 14488 KB Output is correct
10 Correct 157 ms 14268 KB Output is correct
11 Correct 518 ms 14172 KB Output is correct
12 Correct 3 ms 4436 KB Output is correct
13 Runtime error 353 ms 87972 KB Execution killed with signal 11
14 Halted 0 ms 0 KB -