結果
問題 |
No.2337 Equidistant
|
ユーザー |
![]() |
提出日時 | 2025-06-12 12:46:53 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 3,710 bytes |
コンパイル時間 | 492 ms |
コンパイル使用メモリ | 82,560 KB |
実行使用メモリ | 574,896 KB |
最終ジャッジ日時 | 2025-06-12 12:47:27 |
合計ジャッジ時間 | 31,679 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 5 WA * 22 MLE * 1 |
ソースコード
import sys from sys import stdin sys.setrecursionlimit(1 << 25) def main(): input = sys.stdin.read data = input().split() idx = 0 N, Q = int(data[idx]), int(data[idx+1]) idx +=2 edges = [[] for _ in range(N+1)] for _ in range(N-1): a = int(data[idx]) b = int(data[idx+1]) edges[a].append(b) edges[b].append(a) idx +=2 MAX_LOG = 20 parent = [[-1]*(N+1) for _ in range(MAX_LOG)] depth = [0]*(N+1) in_time = [0]*(N+1) out_time = [0]*(N+1) sz = [0]*(N+1) time = 0 from sys import setrecursionlimit setrecursionlimit(1 << 25) def dfs(u, p): nonlocal time in_time[u] = time time +=1 parent[0][u] = p depth[u] = depth[p] +1 if p != -1 else 0 sz[u] =1 for v in edges[u]: if v != p: dfs(v, u) sz[u] += sz[v] out_time[u] = time time +=1 dfs(1, -1) for k in range(1, MAX_LOG): for v in range(1, N+1): if parent[k-1][v] != -1: parent[k][v] = parent[k-1][parent[k-1][v]] else: parent[k][v] = -1 def lca(u, v): if depth[u] < depth[v]: u, v = v, u for k in range(MAX_LOG-1, -1, -1): if depth[u] - (1 << k) >= depth[v]: u = parent[k][u] if u == v: return u for k in range(MAX_LOG-1, -1, -1): if parent[k][u] != parent[k][v]: u = parent[k][u] v = parent[k][v] return parent[0][u] def get_kth_ancestor(u, k): if k <0: return -1 for i in range(MAX_LOG-1, -1, -1): if k >= (1 << i): u = parent[i][u] k -= (1 << i) if u == -1: return -1 return u if k ==0 else -1 def is_ancestor(u, v): return in_time[u] <= in_time[v] and out_time[v] <= out_time[u] for _ in range(Q): S = int(data[idx]) T = int(data[idx+1]) idx +=2 L = lca(S, T) a = depth[S] - depth[L] b = depth[T] - depth[L] D = a + b if D %2 !=0: print(0) continue k = D//2 if k <= a: M = get_kth_ancestor(S, k) else: k_prime = k - a steps = b - k_prime M = get_kth_ancestor(T, steps) u = None if is_ancestor(M, S): delta = depth[S] - depth[M] -1 if delta <0: u_candidate = S if parent[0][u_candidate] == M: u = u_candidate else: u = None else: X = get_kth_ancestor(S, delta) if X != -1 and parent[0][X] == M: u = X else: u = None else: u = None v = None if is_ancestor(M, T): delta = depth[T] - depth[M] -1 if delta <0: v_candidate = T if parent[0][v_candidate] == M: v = v_candidate else: v = None else: X = get_kth_ancestor(T, delta) if X != -1 and parent[0][X] == M: v = X else: v = None else: v = None ans = sz[M] if u is not None: ans -= sz[u] if v is not None: ans -= sz[v] print(ans) if __name__ == '__main__': main()