提出 #24947611
ソースコード 拡げる
import sys from collections import defaultdict, deque def main(f): N = int(f.readline()) link = [[] for _ in range(N+1)] for _ in range(N-1): a, b = map(int, f.readline().split()) link[a].append(b) link[b].append(a) # dp[n] = (c, d) : n を頂点とするサブツリーについての (ノード数, 「子孫 i から n の距離」の合計) dp = [(0, 0)] * (N+1) dists = 0 q = deque() q.append((1, 0)) # (node, parent) while q: i, p = q.pop() if i < 0: c, d = 0, 0 for j in link[-i]: if j == p: continue c_j, d_j = dp[j] c += c_j d += d_j + 1*(c_j) # j->i の距離 1 を各子孫について加える dp[-i] = (c+1, d) links = [] for j in link[-i]: if j == p: continue links.append(j) # 部分和 c_(j+1) + c_(j+2) +... を計算するために、事前に部分和 c_1 + c_2 + ... + c_n を計算 # 部分和 d_(j+1) + d_(j+2) +... を計算するために、事前に部分和 d_1 + d_2 + ... + d_n を計算 c_sum, d_sum = [0], [0] for index in range(len(links)): c_j, d_j = dp[links[index]] c_sum.append(c_sum[-1] + c_j) d_sum.append(d_sum[-1] + d_j) d += d_j c += c_j for index in range(len(links)): c_j, d_j = dp[links[index]] dists += (d_j+c_j)*(c_sum[-1]-c_sum[index+1]) + c_j*((d_sum[-1]-d_sum[index+1])+(c_sum[-1]-c_sum[index+1])) continue q.append((-i, p)) # 帰りがけ順で処理するための番兵 for j in link[i]: if j == p: continue q.append((j, i)) for n in range(1, N+1): dists += dp[n][1] # k -> i の距離をすべて加える print(dists) main(sys.stdin)
提出情報
提出日時 | |
---|---|
問題 | 039 - Tree Distance(★5) |
ユーザ | enakai |
言語 | PyPy3 (7.3.0) |
得点 | 5 |
コード長 | 1820 Byte |
結果 | AC |
実行時間 | 228 ms |
メモリ | 107804 KiB |
ジャッジ結果
セット名 | Sample | All | ||||
---|---|---|---|---|---|---|
得点 / 配点 | 0 / 0 | 5 / 5 | ||||
結果 |
|
|
セット名 | テストケース |
---|---|
Sample | 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt |
All | 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 10_random_small_00.txt, 10_random_small_01.txt, 10_random_small_02.txt, 10_random_small_03.txt, 10_random_small_04.txt, 10_random_small_05.txt, 10_random_small_06.txt, 10_random_small_07.txt, 10_random_small_08.txt, 10_random_small_09.txt, 11_random_large_00.txt, 11_random_large_01.txt, 11_random_large_02.txt, 11_random_large_03.txt, 11_random_large_04.txt, 11_random_large_05.txt, 11_random_large_06.txt, 11_random_large_07.txt, 11_random_large_08.txt, 11_random_large_09.txt, 20_random_max_00.txt, 20_random_max_01.txt, 20_random_max_02.txt, 20_random_max_03.txt, 20_random_max_04.txt, 20_random_max_05.txt, 20_random_max_06.txt, 30_uni_00.txt, 30_uni_01.txt, 40_path_00.txt, 40_path_01.txt |
ケース名 | 結果 | 実行時間 | メモリ |
---|---|---|---|
00_sample_00.txt | AC | 69 ms | 65276 KiB |
00_sample_01.txt | AC | 54 ms | 65188 KiB |
00_sample_02.txt | AC | 58 ms | 65380 KiB |
10_random_small_00.txt | AC | 57 ms | 64920 KiB |
10_random_small_01.txt | AC | 51 ms | 65308 KiB |
10_random_small_02.txt | AC | 57 ms | 65256 KiB |
10_random_small_03.txt | AC | 58 ms | 65292 KiB |
10_random_small_04.txt | AC | 55 ms | 65128 KiB |
10_random_small_05.txt | AC | 56 ms | 65360 KiB |
10_random_small_06.txt | AC | 51 ms | 65264 KiB |
10_random_small_07.txt | AC | 51 ms | 65024 KiB |
10_random_small_08.txt | AC | 56 ms | 65028 KiB |
10_random_small_09.txt | AC | 53 ms | 65088 KiB |
11_random_large_00.txt | AC | 75 ms | 74248 KiB |
11_random_large_01.txt | AC | 113 ms | 76204 KiB |
11_random_large_02.txt | AC | 107 ms | 75816 KiB |
11_random_large_03.txt | AC | 110 ms | 76256 KiB |
11_random_large_04.txt | AC | 111 ms | 76284 KiB |
11_random_large_05.txt | AC | 102 ms | 75500 KiB |
11_random_large_06.txt | AC | 115 ms | 75636 KiB |
11_random_large_07.txt | AC | 109 ms | 76164 KiB |
11_random_large_08.txt | AC | 122 ms | 76536 KiB |
11_random_large_09.txt | AC | 107 ms | 75476 KiB |
20_random_max_00.txt | AC | 227 ms | 89856 KiB |
20_random_max_01.txt | AC | 213 ms | 90116 KiB |
20_random_max_02.txt | AC | 222 ms | 89656 KiB |
20_random_max_03.txt | AC | 215 ms | 89768 KiB |
20_random_max_04.txt | AC | 224 ms | 89936 KiB |
20_random_max_05.txt | AC | 228 ms | 89856 KiB |
20_random_max_06.txt | AC | 220 ms | 89868 KiB |
30_uni_00.txt | AC | 182 ms | 107804 KiB |
30_uni_01.txt | AC | 180 ms | 107800 KiB |
40_path_00.txt | AC | 87 ms | 75056 KiB |
40_path_01.txt | AC | 96 ms | 75976 KiB |