Submission #52100242


Source Code Expand

#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>

struct edge_s {
	int to, id, rev_id;
};

int ec[114514];
struct edge_s *es[114514];

void ae(int f, int t, int id, int rev_id) {
	es[f] = realloc(es[f], sizeof(*es[f]) * (ec[f] + 1));
	if (es[f] == NULL) exit(2);
	es[f][ec[f]].to = t;
	es[f][ec[f]].id = id;
	es[f][ec[f]].rev_id = rev_id;
	ec[f]++;
}

int N;
int A[114514], B[114514];
int C[114514];

struct meow_s {
	uint64_t f_value;
	uint64_t sum_of_C;
};

/* 辺 (両方向) + 最初のノード (来た辺なし) */
struct meow_s memo[114514 * 3];
char memo_valid[114514 * 3];

struct meow_s calc(int node, int from_edge_id) {
	int memo_id = from_edge_id < 0 ? 2 * N + node : from_edge_id;
	struct meow_s ret = {0, 0};
	int i;
	if (memo_valid[memo_id]) return memo[memo_id];
	for (i = 0; i < ec[node]; i++) {
		if (es[node][i].rev_id != from_edge_id) {
			struct meow_s delta = calc(es[node][i].to, es[node][i].id);
			/* 下層の分を足し、さらに上がったので C_i の合計を足す */
			ret.f_value += delta.f_value + delta.sum_of_C;
			/* 新しい C_i の合計を求める */
			ret.sum_of_C += delta.sum_of_C;
		}
	}
	ret.sum_of_C += C[node];
	memo[memo_id] = ret;
	memo_valid[memo_id] = 1;
	return ret;
}

int main(void) {
	int i;
	uint64_t ans;
	if (scanf("%d", &N) != 1) return 1;
	for (i = 1; i < N; i++) {
		if (scanf("%d%d", &A[i], &B[i]) != 2) return 1;
		ae(A[i], B[i], 2 * (i - 1), 2 * (i - 1) + 1);
		ae(B[i], A[i], 2 * (i - 1) + 1, 2 * (i - 1));
	}
	for (i = 1; i <= N; i++) {
		if (scanf("%d", &C[i]) != 1) return 1;
	}
	ans = calc(1, -1).f_value;
	for (i = 2; i <= N; i++) {
		uint64_t candidate = calc(i, -1).f_value;
		if (candidate < ans) ans = candidate;
	}
	printf("%" PRIu64 "\n", ans);
	return 0;
}

/*

f(x) = (C_i × そこに行くまでのステップ数) の合計
これをサブツリーについて計算する
単純に C_i の和 → これを1段深くなるごとに加える

*/

Submission Info

Submission Time
Task E - Minimize Sum of Distances
User mikecat
Language C (gcc 12.2.0)
Score 0
Code Size 2030 Byte
Status TLE
Exec Time 2211 ms
Memory 19700 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 0 / 475
Status
AC × 3
AC × 23
TLE × 8
Set Name Test Cases
Sample example0.txt, example1.txt, example2.txt
All example0.txt, example1.txt, example2.txt, test_00.txt, test_01.txt, test_02.txt, test_03.txt, test_04.txt, test_05.txt, test_06.txt, test_07.txt, test_08.txt, test_09.txt, test_10.txt, test_11.txt, test_12.txt, test_13.txt, test_14.txt, test_15.txt, test_16.txt, test_17.txt, test_18.txt, test_19.txt, test_20.txt, test_21.txt, test_22.txt, test_23.txt, test_24.txt, test_25.txt, test_26.txt, test_27.txt
Case Name Status Exec Time Memory
example0.txt AC 0 ms 1648 KiB
example1.txt AC 1 ms 1744 KiB
example2.txt AC 1 ms 1648 KiB
test_00.txt AC 32 ms 8640 KiB
test_01.txt AC 20 ms 6312 KiB
test_02.txt AC 39 ms 9868 KiB
test_03.txt AC 1127 ms 3912 KiB
test_04.txt TLE 2210 ms 9012 KiB
test_05.txt TLE 2207 ms 6232 KiB
test_06.txt AC 23 ms 8688 KiB
test_07.txt AC 21 ms 9392 KiB
test_08.txt AC 17 ms 6880 KiB
test_09.txt AC 55 ms 12732 KiB
test_10.txt AC 50 ms 12752 KiB
test_11.txt AC 55 ms 12680 KiB
test_12.txt AC 48 ms 12844 KiB
test_13.txt AC 56 ms 12836 KiB
test_14.txt AC 48 ms 12844 KiB
test_15.txt TLE 2207 ms 11636 KiB
test_16.txt TLE 2211 ms 11556 KiB
test_17.txt TLE 2208 ms 11652 KiB
test_18.txt TLE 2208 ms 11644 KiB
test_19.txt TLE 2211 ms 11576 KiB
test_20.txt TLE 2208 ms 11716 KiB
test_21.txt AC 66 ms 19448 KiB
test_22.txt AC 58 ms 19700 KiB
test_23.txt AC 68 ms 17724 KiB
test_24.txt AC 57 ms 16976 KiB
test_25.txt AC 69 ms 18204 KiB
test_26.txt AC 60 ms 18600 KiB
test_27.txt AC 0 ms 1756 KiB