結果
問題 | No.1094 木登り / Climbing tree |
ユーザー |
![]() |
提出日時 | 2024-07-21 21:11:32 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,518 bytes |
コンパイル時間 | 242 ms |
コンパイル使用メモリ | 82,540 KB |
実行使用メモリ | 324,600 KB |
最終ジャッジ日時 | 2024-07-21 21:12:13 |
合計ジャッジ時間 | 39,453 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
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)]P[0] = list(range(N))D = [-1] * NC = [0] * Ndef dfs(x, d):for y,c in E[x]:if D[y] == -1:C[y] = C[x] + cP[1][y] = xD[y] = d + 1dfs(y, d + 1)D[0] = 0dfs(0, 0)# ダブリングの計算for i in range(1,NL - 1):for j in range(N):P[i + 1][j] = P[i][P[i][j]]for q 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 = 1while 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 = 1tmp = 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)