結果

問題 No.2337 Equidistant
ユーザー lam6er
提出日時 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
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

import sys
from collections import deque
sys.setrecursionlimit(1 << 25)
def main():
input = sys.stdin.read().split()
idx = 0
N, Q = int(input[idx]), int(input[idx+1])
idx += 2
adj = [[] 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 += 2
depth = [0] * (N + 1)
parent = [0] * (N + 1)
q = deque([1])
depth[1] = 0
parent[1] = 0
while q:
u = q.popleft()
for v in adj[u]:
if v != parent[u] and depth[v] == 0:
depth[v] = depth[u] + 1
parent[v] = u
q.append(v)
LOG = 20
up = [[0] * (N + 1) for _ in range(LOG)]
up[0] = parent
for 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]
continue
stack.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)] = s
edge_map[(v, u)] = N - s
else:
s = size[u]
edge_map[(v, u)] = s
edge_map[(u, v)] = N - s
def lca(u, v):
if depth[u] < depth[v]:
u, v = v, u
for k in reversed(range(LOG)):
if depth[u] - (1 << k) >= depth[v]:
u = up[k][u]
if u == v:
return u
for 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 = u
for i in range(LOG):
if k & (1 << i):
current = up[i][current]
if current == 0:
return 0
return current
output = []
for _ in range(Q):
S = int(input[idx])
T = int(input[idx+1])
idx += 2
L = lca(S, T)
dS = depth[S] - depth[L]
dT = depth[T] - depth[L]
D = dS + dT
if D % 2 != 0:
output.append('0')
continue
k = D // 2
if k <= dS:
M = get_kth(S, k)
else:
M = get_kth(T, (dS + dT) - k)
if k == 0:
u = S
else:
u = get_kth(S, k - 1)
steps_t = (D - k) - 1
if steps_t < 0:
v = T
else:
v = get_kth(T, steps_t)
a = edge_map.get((M, u), 0)
b = edge_map.get((M, v), 0)
ans = N - a - b
output.append(str(ans))
print('\n'.join(output))
if __name__ == '__main__':
main()
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0