結果
問題 | No.1094 木登り / Climbing tree |
ユーザー |
![]() |
提出日時 | 2024-07-21 20:31:40 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,496 bytes |
コンパイル時間 | 203 ms |
コンパイル使用メモリ | 82,304 KB |
実行使用メモリ | 319,600 KB |
最終ジャッジ日時 | 2024-07-21 20:32:30 |
合計ジャッジ時間 | 39,840 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | WA * 26 |
ソースコード
import syssys.setrecursionlimit(200050)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 = add = da - dbi = 0while dd > 0:if dd & 1:aa = P[i][aa]i += 1dd >>= 1# 二分探索でLCAを求めるlb = -1ub = db + 1mida = aamidb = bwhile ub - lb > 1:mid = (ub + lb) // 2i = 0tmp = midwhile tmp > 0:if tmp & 1:mida = P[i][mida]midb = P[i][midb]i += 1tmp >>= 1if mida == midb:ub = midelse:lb = mid# LCAからの2頂点の距離の和が答えans = C[a] + C[b] - 2 * C[mida]print(ans)