結果
問題 | No.2337 Equidistant |
ユーザー |
![]() |
提出日時 | 2025-03-26 15:53:38 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 3,043 bytes |
コンパイル時間 | 283 ms |
コンパイル使用メモリ | 82,288 KB |
実行使用メモリ | 272,212 KB |
最終ジャッジ日時 | 2025-03-26 15:54:50 |
合計ジャッジ時間 | 35,248 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 6 WA * 22 |
ソースコード
import sysfrom collections import dequesys.setrecursionlimit(1 << 25)def main():input = sys.stdin.read().split()idx = 0N, Q = int(input[idx]), int(input[idx+1])idx += 2adj = [[] for _ in range(N+1)]for _ in range(N-1):a = int(input[idx])b = int(input[idx+1])adj[a].append(b)adj[b].append(a)idx += 2depth = [0] * (N + 1)parent = [0] * (N + 1)q = deque([1])depth[1] = 0parent[1] = 0while q:u = q.popleft()for v in adj[u]:if v != parent[u] and depth[v] == 0:depth[v] = depth[u] + 1parent[v] = uq.append(v)LOG = 20up = [[0] * (N + 1) for _ in range(LOG)]up[0] = parentfor k in range(1, LOG):for v in range(1, N + 1):up[k][v] = up[k-1][up[k-1][v]]size = [1] * (N + 1)stack = [(1, False)]while stack:u, visited = stack.pop()if visited:for v in adj[u]:if v != parent[u]:size[u] += size[v]continuestack.append((u, True))for v in adj[u]:if v != parent[u]:stack.append((v, False))edge_map = {}for u in range(1, N+1):for v in adj[u]:if depth[u] < depth[v]:s = size[v]edge_map[(u, v)] = sedge_map[(v, u)] = N - selse:s = size[u]edge_map[(v, u)] = sedge_map[(u, v)] = N - sdef lca(u, v):if depth[u] < depth[v]:u, v = v, ufor k in reversed(range(LOG)):if depth[u] - (1 << k) >= depth[v]:u = up[k][u]if u == v:return ufor k in reversed(range(LOG)):if up[k][u] != up[k][v]:u = up[k][u]v = up[k][v]return parent[u]def get_kth(u, k):current = ufor i in range(LOG):if k & (1 << i):current = up[i][current]if current == 0:return 0return currentoutput = []for _ in range(Q):S = int(input[idx])T = int(input[idx+1])idx += 2L = lca(S, T)dS = depth[S] - depth[L]dT = depth[T] - depth[L]D = dS + dTif D % 2 != 0:output.append('0')continuek = D // 2if k <= dS:M = get_kth(S, k)else:M = get_kth(T, (dS + dT) - k)if k == 0:u = Selse:u = get_kth(S, k - 1)steps_t = (D - k) - 1if steps_t < 0:v = Telse:v = get_kth(T, steps_t)a = edge_map.get((M, u), 0)b = edge_map.get((M, v), 0)ans = N - a - boutput.append(str(ans))print('\n'.join(output))if __name__ == '__main__':main()