結果
問題 |
No.1094 木登り / Climbing tree
|
ユーザー |
![]() |
提出日時 | 2025-03-20 21:11:43 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 991 ms / 2,000 ms |
コード長 | 2,177 bytes |
コンパイル時間 | 371 ms |
コンパイル使用メモリ | 82,928 KB |
実行使用メモリ | 211,948 KB |
最終ジャッジ日時 | 2025-03-20 21:13:00 |
合計ジャッジ時間 | 23,307 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 26 |
ソースコード
import sys from collections import deque def main(): data = sys.stdin.read().split() idx = 0 N = int(data[idx]) idx += 1 edges = [[] for _ in range(N + 1)] # 1-based indexing for _ in range(N - 1): a = int(data[idx]) b = int(data[idx + 1]) c = int(data[idx + 2]) edges[a].append((b, c)) edges[b].append((a, c)) idx += 3 # BFS to set parent, depth, and distance from root parent = [0] * (N + 1) depth = [0] * (N + 1) dist = [0] * (N + 1) root = 1 q = deque([root]) parent[root] = 0 depth[root] = 0 dist[root] = 0 while q: u = q.popleft() for v, c in edges[u]: if parent[u] != v and parent[v] == 0: parent[v] = u depth[v] = depth[u] + 1 dist[v] = dist[u] + c q.append(v) # Precompute binary lifting table for LCA log_max = 20 table = [[0] * (N + 1) for _ in range(log_max)] table[0] = parent[:] # Base case: direct parent for k in range(1, log_max): for v in range(1, N + 1): table[k][v] = table[k - 1][table[k - 1][v]] # Function to find LCA using binary lifting def get_lca(u, v): if depth[u] < depth[v]: u, v = v, u # Bring u to the depth of v for k in range(log_max - 1, -1, -1): if depth[u] - (1 << k) >= depth[v]: u = table[k][u] if u == v: return u # Now bring both up until LCA is found for k in range(log_max - 1, -1, -1): if table[k][u] != table[k][v]: u = table[k][u] v = table[k][v] return table[0][u] # Process queries Q = int(data[idx]) idx += 1 results = [] for _ in range(Q): s = int(data[idx]) t = int(data[idx + 1]) idx += 2 if s == t: results.append(0) continue lca_node = get_lca(s, t) result = dist[s] + dist[t] - 2 * dist[lca_node] results.append(result) print('\n'.join(map(str, results))) if __name__ == '__main__': main()