【ybt高效进阶2-4-3】【luogu P4551】最长异或路径
最长异或路径
题目链接:ybt高效进阶2-4-3 / luogu P4551
题目大意
给定一棵 n 个点的带权树,结点下标从 1 开始到 N。寻找树中找两个结点,求最长的异或路径。
异或路径指的是指两个结点之间唯一路径上的所有边权的异或。
思路
首先看到要异或的值最大,我们要想到可以用 Trie 树来贪心弄。
但是它好像不知道怎么弄,那我们先不管它。
那我们看到是一棵树,那我们可以试着统计 到根节点(我这里设是 )的异或路径的长度是多少。
那我们考虑能不能用这个表示出任意两个点之间的异或路径。
这里先给出结论,其实就是两个点到根节点的异或路径异或起来得出的值。
我们来证明:
分两种情况,分别是一个点在另一个点到根节点的路径上,要么就是两条路径是分开的,不会相交。
- 第一种,那我们可以知道一个点,就是一个值异或它自己就是 ,就会消掉。那你想想,第一种情况时这个图:
那 号点到根节点的异或路径就是 , 号点到根节点的异或路径是 ,我们要的是 。
那你发现,把它们异或起来,就是 。(两个 异或起来抵消掉了) - 第二种,那我们可以画图。
那 号点到根节点的异或路径就是 , 号点到根节点的异或路径是 ,我们要的是 。
那你发现,把它们异或起来,就是 。
那你就可以一开始预处理出到根节点的异或路径,然后枚举两个点,然后算这两个点的异或路径,然后取最大值。
但是很明显这样是 的,它会超时。
那我们就想一想有什么方法可以快速求最大值的。
想想我们之前一开始想用什么方法?
没错,就是 Trie 树。
我们可以把每个点到根节点的异或路径都放进 Trie 树里面构造。
然后每次枚举你要的异或路径的另一个点,然后跟 Trie 树里面的路径匹配找到最大值。
前面做过一题就是求这个最大值的,主要的就是用了贪心的思想。
从高位向低位枚举,然后如果有跟你这一位不同的就优先选,同时统计这一位异或之后是 对数的贡献。然后如果没有不同的,就看有没有相同的。
(因为毕竟你可以这一位相同,然后尽可能让后面更高的位不同,这样的贡献就更大)
那如果想相同不相同都没有,那就只能以当前的贡献退出了。
(如果想看之前的那一题可以点我查看,不过我只写在了 csdn,博客园里没有,因为比较简单)
然后对这些最大值选一个最大的,就是答案了。
代码
__EOF__

本文链接:https://www.cnblogs.com/Sakura-TJH/p/YBT_GXJJ_2-4-3.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现