結果
問題 | No.1094 木登り / Climbing tree |
ユーザー |
![]() |
提出日時 | 2024-07-20 19:59:03 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,482 bytes |
コンパイル時間 | 719 ms |
コンパイル使用メモリ | 82,216 KB |
実行使用メモリ | 145,112 KB |
最終ジャッジ日時 | 2024-07-20 19:59:35 |
合計ジャッジ時間 | 31,382 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | WA * 19 RE * 7 |
ソースコード
from math import log2N = int(input())E = [[] for _ in range(N)]for _ in range(N - 1):a,b,c = map(int,input().split())a -= 1b -= 1E[a].append((b,c))E[b].append((a,c))NL = int(log2(N)) + 2P = [[0] * N for _ in range(NL)]D = [-1] * NC = [0] * Ndef dfs(x, d):for y,c in E[x]:if D[y] == -1:C[y] = C[x] + cP[0][y] = xD[y] = d + 1dfs(y, d + 1)D[0] = 0dfs(0, 0)# ダブリングの計算for i in range(NL - 1):for j in range(N):P[i + 1][j] = P[i][P[i][j]]for _ in range(int(input())):a, b = map(int, input().split())a -= 1b -= 1# 同じ深さの頂点まで深い方を遡らせるda = D[a]db = D[b]if da < db:da, db = db, daa, b = b, aaa = aif da > db:dd = da - dbi = 0while dd > 0:if dd & 1:aa = P[i][aa]i += 1dd >>= 1# 二分探索でLCAを求めるlb = -1ub = da + 1mida = aamidb = bwhile ub - lb > 1:mid = (ub + lb) // 2i = 0while mid > 0:if mid & 1:mida = P[i][mida]midb = P[i][midb]i += 1mid >>= 1if mida == midb:ub = midelse:lb = mid# LCAからの2頂点の距離の和が答えans = C[a] + C[b] - 2 * C[mida]print(ans)