답안 #6993

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
6993 2014-07-12T07:38:50 Z ainta 공장들 (JOI14_factories) C++
15 / 100
6000 ms 189864 KB
#include "factories.h"
#include<algorithm>
#define INF 99999999999999999LL
using namespace std;
int L[1000010];
int nxt[1000010], pv[1000010], ed[1000010];
int n, Q[500010], pp[23][500010], sz, pcnt[500010];
int D[500010], par[500010];
long long D2[500010], dist[23][500010];
bool chk[500010];
void BFS(int a){
	int h = 0, t = 0, i, x;
	Q[++t] = a, D2[a] = 0, D[a] = 1;
	while (h < t){
		x = Q[++h];
		for (i = pv[x]; i; i = nxt[i]){
			if (!D[ed[i]] && !chk[ed[i]]){
				Q[++t] = ed[i];
				D2[ed[i]] = D2[x] + L[i];
				D[ed[i]] = 1;
				par[ed[i]] = x;
			}
		}
	}
	sz = t;
}
int Get_mid(int a){
	int i, x;
	BFS(a);
	for (i = sz; i >= 1; i--){
		x = Q[i];
		if (D[x] > sz / 2) break;
		D[par[x]] += D[x];
	}
	for (i = 1; i <= sz; i++){
		D[Q[i]] = 0;
	}
	return x;
}
void DFS(int a, int ppar, int pdis){
	int i, mid, x;
	mid = Get_mid(a);
	if (sz == 1){
		pp[pcnt[a]][a] = a;
		dist[pcnt[a]][a] = 0;
		pcnt[a]++;
		pp[pcnt[a]][a] = ppar;
		dist[pcnt[a]][a] = pdis;
		pcnt[a]++;
		return;
	}
	chk[mid] = true;
	for (i = pv[mid]; i; i = nxt[i]){
		x = ed[i];
		if (!chk[x]){
			DFS(x, mid, L[i]);
		}
	}
	pp[pcnt[mid]][mid] = mid;
	dist[pcnt[mid]][mid] = 0;
	pcnt[mid]++;
	chk[mid] = false;
	if (ppar == -1)return;
	BFS(a);
	for (i = 1; i <= sz; i++){
		x = Q[i];
		D[x] = 0;
		pp[pcnt[x]][x] = ppar;
		dist[pcnt[x]][x] = D2[x] + pdis;
		pcnt[x]++;
	}
}


long long Len[500010];

void Init(int N, int A[], int B[], int D[]) {
	int i, cnt = 0;
	for (i = 0; i < N - 1; i++){
		nxt[++cnt] = pv[A[i]]; ed[cnt] = B[i]; pv[A[i]] = cnt; L[cnt] = D[i];
		nxt[++cnt] = pv[B[i]]; ed[cnt] = A[i]; pv[B[i]] = cnt; L[cnt] = D[i];
	}
	DFS(0, -1, 0);
	for (i = 0; i < N; i++)Len[i] = INF;
}

long long Query(int S, int X[], int T, int Y[]) {
	register int i, j, x;
	long long Res = INF, t;
	for (i = 0; i != S; i++){
		x = X[i];
		for (j = 0; j != pcnt[x]; j++){
			if (Len[pp[j][x]] > dist[j][x]) Len[pp[j][x]] = dist[j][x];
		}
	}
	for (i = 0; i != T; i++){
		x = Y[i];
		for (j = 0; j != pcnt[x]; j++){
			t = Len[pp[j][x]] + dist[j][x];
			if (Res > t) Res = t;
		}
	}
	for (i = 0; i != S; i++){
		x = X[i];
		for (j = 0; j != pcnt[x]; j++){
			Len[pp[j][x]] = INF;
		}
	}
	return Res;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 189864 KB Output is correct
2 Correct 388 ms 189864 KB Output is correct
3 Correct 460 ms 189864 KB Output is correct
4 Correct 436 ms 189864 KB Output is correct
5 Correct 448 ms 189864 KB Output is correct
6 Correct 288 ms 189864 KB Output is correct
7 Correct 424 ms 189864 KB Output is correct
8 Correct 424 ms 189864 KB Output is correct
9 Correct 444 ms 189864 KB Output is correct
10 Correct 272 ms 189864 KB Output is correct
11 Correct 400 ms 189864 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 189864 KB Output is correct
2 Correct 5412 ms 189864 KB Output is correct
3 Execution timed out 6000 ms 189860 KB Program timed out
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 6000 ms 189860 KB Program timed out
2 Halted 0 ms 0 KB -