提出 #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
結果
AC × 3
AC × 34
セット名 テストケース
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