結果
| 問題 |
No.898 tri-βutree
|
| コンテスト | |
| ユーザー |
tktk_snsn
|
| 提出日時 | 2020-06-05 19:33:57 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
AC
|
| 実行時間 | 3,754 ms / 4,000 ms |
| コード長 | 1,724 bytes |
| コンパイル時間 | 249 ms |
| コンパイル使用メモリ | 13,184 KB |
| 実行使用メモリ | 121,284 KB |
| 最終ジャッジ日時 | 2024-12-16 07:03:47 |
| 合計ジャッジ時間 | 60,305 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 21 |
ソースコード
from collections import defaultdict
import sys
input = sys.stdin.buffer.readline
sys.setrecursionlimit(10 ** 7)
N = int(input())
D = N.bit_length()
edge = [[] for _ in range(N)]
for _ in range(N - 1):
a, b, c = map(int, input().split())
edge[a].append((b, c))
edge[b].append((a, c))
Q = int(input())
query = [sorted(list(map(int, input().split()))) for _ in range(Q)]
root = 0
dist = [-1] * N
dist[root] = 0
depth = [0] * N
parent = [[-1] * N for _ in range(D)]
node = [root]
while node:
s = node.pop()
d = dist[s]
dep = depth[s]
for t, c in edge[s]:
if dist[t] != -1:
continue
dist[t] = d + c
depth[t] = dep + 1
node.append(t)
parent[0][t] = s
for i in range(D - 1):
for j in range(N):
parent[i + 1][j] = parent[i][parent[i][j]]
def lower_ancester(x, h):
for i in reversed(range(D)):
if h >= (1 << i):
h -= (1 << i)
x = parent[i][x]
return x
def LCA(u, v):
if depth[u] < depth[v]:
u, v = v, u
u = lower_ancester(u, depth[u] - depth[v])
if u == v:
return u
for i in reversed(range(D)):
if parent[i][u] != parent[i][v]:
u = parent[i][u]
v = parent[i][v]
return parent[0][u]
path = defaultdict(int)
for x, y, z in query:
if not path[(x, y)]:
lca = LCA(x, y)
path[(x, y)] = dist[x] + dist[y] - 2 * dist[lca]
if not path[(y, z)]:
lca = LCA(y, z)
path[(y, z)] = dist[y] + dist[z] - 2 * dist[lca]
if not path[(x, z)]:
lca = LCA(x, z)
path[(x, z)] = dist[x] + dist[z] - 2 * dist[lca]
size = (path[(x, y)] + path[(y, z)] + path[(x, z)]) // 2
print(size)
tktk_snsn