1 条题解
-
0
题意简述
给定一棵 个节点的树,需要给每条边赋一个 的整数权值。
有 条限制:每条限制 表示 到 路径上所有边的权值异或和等于 。
要求判断是否存在合法赋值,若存在,输出一种方案,使得所有边权异或和 最小。
核心转化
设 表示从节点 到节点 的路径上所有边的异或和。
对于树上的任意两个节点 ,它们的路径异或为:这是因为从 到 的路径在 和 中分别出现一次,异或后抵消。
因此:
- 每条边 的权值可以表示为 。
- 给边赋权等价于给每个节点(除根外)赋 。
条件图的建立
对每条限制 ,我们有:
这可以看作在图 中连一条无向边 ,权值为 。
若 和 在 中连通,则 可由 推导出来:
可行性判断
对 的每个连通分量:
- 任选一个节点 ,设 ,通过 BFS/DFS 求出分量内所有 。
- 对分量内的每条边 ,检查 是否等于 。
若某条边不满足,则无解。
最小化目标
目标:最小化 。
将 代入:
$$S = \bigoplus_{\text{edge } (u,v)} (p_u \oplus p_v) $$在异或和中, 出现的次数等于节点 在原树 中的度数 。
$$S = \bigoplus_{i=1}^n \left( p_i \text{ 如果 } \deg(i) \text{ 是奇数,否则 } 0 \right) $$
因此:即:
自由度的处理
设 有 个连通分量,第 个分量中任选一个代表 ,则分量内任意节点 的 可表示为:
其中 是已知常数()。
于是:
$$S = \bigoplus_{j=1}^k \left( p_{r_j} \oplus \left( \bigoplus_{\substack{i \in \text{comp}_j \\ \deg(i) \text{ odd}}} d_i \right) \right) $$记:
$$c_j = \bigoplus_{\substack{i \in \text{comp}_j \\ \deg(i) \text{ odd}}} d_i $$则:
$$S = \bigoplus_{j=1}^k \left( p_{r_j} \oplus c_j \right) $$
分类讨论
-
若 对所有 成立,则 。
- 若 ,。
- 若 ,我们可以独立选择 以最小化 。
由于 是 的异或,最小值为 ,只需让所有 相等即可(例如全 )。
-
若存在 ,则 。
设 为满足 的 集合。
若 为奇数,则 恒非零,最小值为 (可通过适当调整 实现)。
若 为偶数,可让 。
实际操作中,我们固定 ,对每个 若 则设 使 最小。
算法步骤
- 读入树 ,计算每个节点的度数 。
- 建立图 :对每个限制 ,在 和 间加无向边权 。
- 对 的每个连通分量:
- 任选代表 ,设 ,BFS 求分量内所有 。
- 检查分量内边权是否一致。
- 若检查失败,输出
"No"。 - 否则,计算 $c_j = \bigoplus_{\substack{i \in \text{comp}_j \\ \deg(i) \text{ odd}}} d_i$。
- 选择 使 最小。
- 根据 计算边权 并输出。
复杂度
- 时间复杂度:(若使用位运算优化,也可 通过)
- 空间复杂度:
这样,我们就能在满足条件的前提下,最小化所有边权的异或和。
- 1
信息
- ID
- 6190
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 2
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者