import sysfrom collections import dequedef main: input = sys.stdin.read.split ptr = 0 n, q = map(int, input[ptr:ptr+2]) ptr += 2 # 建树 tree = [ for _ in range(n+1)] for i in range(2, n+1): f = int(input[ptr]) ptr += 1 tree[f].append(i) tree[i].append(f) # BFS计算深度和父子关系 depth = [0]*(n+1) parent = [0]*(n+1) q_bfs = deque([1]) parent[1] = 0 while q_bfs: u = q_bfs.popleft for v in tree[u]: if v != parent[u]: parent[v] = u depth[v] = depth[u] + 1 q_bfs.append(v) # 预处理每个节点的叶子后代数量 leaf_count = [0]*(n+1) # 先找出所有叶子节点(度数为1且不是根) leaves = set for u in range(1, n+1): if u != 1 and len(tree[u]) == 1: leaves.add(u) # 自底向上计算每个节点的叶子数量 # 我们需要先处理深度大的节点 nodes_by_depth = sorted(range(1, n+1), key=lambda x: -depth[x]) for u in nodes_by_depth: if u in leaves: leaf_count[u] = 1 else: for v in tree[u]: if v != parent[u]: leaf_count[u] += leaf_count[v] # 处理查询 a_list = list(map(int, input[ptr:ptr+q])) ptr += q b_list = list(map(int, input[ptr:ptr+q])) ptr += q res = 0 for a, b in zip(a_list, b_list): cnt = leaf_count[a] * leaf_count[b] res ^= cnt print(res)if __name__ == "__main__": main摘要:import sysfrom collections import dequedef main: input = sys.stdin.read.split ptr = 0 n, q = map(int, input[ptr:ptr+2]) ptr += 2 #
来源:小杨科技论