제출 #1349043

#제출 시각아이디문제언어결과실행 시간메모리
1349043tsengangFactories (JOI14_factories)C++20
컴파일 에러
0 ms0 KiB
#include <bits/stdc++.h>
#define ll long long
#define ff first
#define ss second
#define pb push_back
#define all(x) (x).begin(), (x).end()
#define ertunt return
#define rall(x) x.rbegin(),x.rend()
using namespace std;
ll lg = 20;
ll n;
vector<ll>sz(500005);
vector<ll>dead(500005);
vector<ll>parC(500005,-1);
vector<vector<pair<ll,ll>>>adj(500005);
vector<ll>best(500005,1e15);
vector<ll>def(500005,0);
vector<ll>h(500005);
vector<vector<ll>>anc(500005);
vector<vector<ll>>dista(500005);
void dfs(ll x,ll p,ll d){
	def[x] = d;
	h[x] = (p==-1 ? 0 : h[p]+1);
	for(auto [y,w] : adj[x]){
		if(y!=p) dfs(y,x,d+w);
	}
}
ll dfs_size(ll x,ll p){
	sz[x] = 1;
	for(auto [y,w] : adj[x]){
		if(y != p && !dead[y]){
			sz[x] += dfs_size(y,x);
		}
	}
	return sz[x];
}
ll dfs_centroid(ll x,ll p,ll compsize){
	for(auto [y,w] : adj[x]){
		if(y != p && !dead[y]){
			if(sz[y] > compsize/2) return dfs_centroid(y,x,compsize);
		}
	}
	return x;
}
void dfs_dist(ll u,ll p,ll c,ll d){
	anc[u].pb(c);
	dista[u].pb(d);
	for(auto [v,w]: adj[u]){
		if(v!=p && !dead[v]) dfs_dist(v,u,c,d+w);
	}
}
void build(ll x,ll p){
	ll compsize = dfs_size(x,-1);
	ll c = dfs_centroid(x,-1,compsize);
	parC[c] = p;
	dead[c] = 1;

	dfs_dist(c,-1,c,0);

	for(auto [y,w] : adj[c]){
		if(!dead[y]) build(y,c);
	}
}
void Init(int N, int A[], int B[], int D[]){
	n = N;
	for(ll i = 0; i < n; i++){
		adj[i].clear();
		dead[i] = 0;
		parC[i] = -1;
		best[i] = 1e15;
		anc[i].clear();
		dista[i].clear();
	}
	for(ll i = 0; i < n-1; i++){
		adj[A[i]].pb({B[i],D[i]});
		adj[B[i]].pb({A[i],D[i]});
	}
	dfs(0,-1,0);
	build(0,-1);
}
void upd(ll u, vector<ll>& touched){
	for(ll i=0;i<anc[u].size();i++){
		ll c = anc[u][i];
		ll d = dista[u][i];
		if(best[c]==1e15) touched.pb(c);
		best[c] = min(best[c],d);
	}
}
ll Query(int S, int A[], int T, int B[]){
	vector<ll> touched;
	for(int i=0;i<S;i++) upd(A[i],touched);
	ll ans = 1e18;
	for(int i=0;i<T;i++){
		for(ll j=0;j<anc[B[i]].size();j++){
			ll c = anc[B[i]][j];
			ll d = dista[B[i]][j];
			ans = min(ans,best[c]+d);
		}
	}
	for(auto x:touched) best[x] = 1e15;
	return ans;
}

컴파일 시 표준 에러 (stderr) 메시지

g++: fatal error: Killed signal terminated program cc1plus
compilation terminated.