C. 树上异或路径

    传统题 2000ms 512MiB
显示设置

树上异或路径

该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。

树上异或路径

题目背景

考古队在一片遗迹里发现了一张古老的地图:若干座石塔之间由通道相连,任意两座石塔之间恰好存在唯一一条通路。每条通道上都刻着一个数字。探险家不仅想知道“异或值最大”的那一对石塔,还想知道有多少对石塔的路径异或值恰好等于藏宝图上的数字 XX。

题目描述

给定一棵 nn 个结点的树,结点编号 11 到 nn,第 ii 条边有非负整数权值 wiw_i。再给定一个非负整数 XX。

对任意两个结点 u,vu, v,定义它们的路径异或和为:从 uu 到 vv 的唯一简单路径上所有边权的按位异或结果。

请你完成两件事:

  1. 求出所有满足 1≤u<v≤n1 \le u < v \le n 的点对 (u,v)(u,v) 中,路径异或和的最大值;
  2. 求出所有满足 1≤u<v≤n1 \le u < v \le n 的点对中,路径异或和恰好等于 XX 的点对个数。

按位异或(记为 ⊕\oplus)指把两个整数写成二进制后逐位比较,相同为 00,不同为 11。例如 5⊕3=65 \oplus 3 = 6。

输入格式

从标准输入读入数据。

第一行两个整数 n,Xn, X。

接下来 n−1n-1 行,每行三个整数 ui,vi,wiu_i, v_i, w_i,表示结点 uiu_i 与 viv_i 之间有一条权值为 wiw_i 的边,保证给出的图是一棵树。

输出格式

输出到标准输出。

输出一行两个整数,用一个空格隔开:路径异或和的最大值,以及路径异或和恰好等于 XX 的点对个数。

样例 1 输入

3 2
1 2 5
2 3 7

样例 1 输出

7 1

样例 1 解释

三条路径的异或和分别是:(1,2)(1,2) 为 55,(1,3)(1,3) 为 5⊕7=25 \oplus 7 = 2,(2,3)(2,3) 为 77。最大值是 77;恰好等于 X=2X=2 的点对只有 (1,3)(1,3) 一对,所以第二个数是 11。

样例 2 输入

4 0
1 2 0
2 3 1
3 4 1

样例 2 输出

1 3

样例 2 解释

以 11 为根,根到各点的异或值为 0,0,1,00, 0, 1, 0。两两异或的结果中最大的是 11(例如 (1,3)(1,3));异或值为 00 的点对有 (1,2),(1,4),(2,4)(1,2),(1,4),(2,4),共 33 对。

特殊性质

  • 特殊性质 A:所有边权都不超过 11,即 wi∈{0,1}w_i \in \{0,1\}。此时任意路径的异或和只能是 00 或 11,第一问的答案不超过 11,可以直接统计“异或和为 00 与 11 的点对是否存在”,计数部分也可以按“同一取值内部的点对数”直接算。
  • 特殊性质 B:树是一条链,即对每个 1≤i<n1 \le i < n 都有一条连接 ii 与 i+1i+1 的边,且不存在其它边。此时问题退化成序列上的“前缀异或”问题。
  • 特殊性质 C:X=0X = 0。此时第二问变成“统计异或和恰为 00 的点对数”,也就是统计根到各点的异或值里有多少对相等。

数据范围与子任务

子任务 测试点 分值 n≤n \le wi≤w_i \le 特殊性质
1 1∼61 \sim 6 3030 20002000 10910^9 无
2 7∼107 \sim 10 2020 2×1052 \times 10^5 11 A 或 C
3 11∼1411 \sim 14 10910^9 B
4 15∼2015 \sim 20 3030 无额外保证

对全部测试数据,保证 2≤n≤2×1052 \le n \le 2 \times 10^5,0≤wi≤1090 \le w_i \le 10^9,0≤X≤1090 \le X \le 10^9。

部分分提示

  • 子任务 1:n≤2000n \le 2000,直接枚举所有点对,并用一次 DFS 求出根到每个点的异或值后 O(1)O(1) 计算路径异或和,总共 O(n2)O(n^2)。
  • 子任务 2:满足 A 时异或值只有 00 和 11 两种,第一问只要看是否两种取值都出现,第二问直接统计取值分布;满足 C 时第二问只需统计相同取值之间能组成的点对数(若某个取值出现 cc 次,就有 c(c−1)2\frac{c(c-1)}{2} 对)。
  • 子任务 3:树是链,可以用前缀异或把它变成“一串数字两两异或”的问题,仍然可以用 01-Trie 求最大异或对、用排序 + 双指针/二分统计等于 XX 的对数。
  • 子任务 4:先求根到每个点的异或值 did_i(路径异或和就是 du⊕dvd_u \oplus d_v)。第一问用 01-Trie 求“最大异或对”;第二问把 dd 排序,对每个 did_i 二分统计 di⊕Xd_i \oplus X 的出现次数(只统计下标更大的,避免重复)。注意答案要用 6464 位整数。

提交说明

本题使用标准输入输出。程序应从标准输入读入数据,并将答案输出到标准输出。

CSP-S 模拟赛 · 第二套

未参加
状态
已结束
规则
OI
题目
4
开始于
2026-10-2 14:00
结束于
2026-10-2 18:00
持续时间
4 小时
主持人
参赛人数
1