异或前缀和+DFS hdu5416 CRB and Tree

该博客介绍了如何利用位异或性质解决树上节点间路径异或和的问题。通过理解f(u,v)=f(1,u)^f(1,v),可以优化算法,对于每个查询s,通过DFS计算f(1,v)并更新答案。题目提供了Q个询问,每个询问求解特定路径异或和等于s的情况数,通过离线处理得到复杂度为O(Q*N)的解决方案。" 120742225,11522795, MQTT协议详解:物联网中的消息传输,"['物联网', 'TCP/IP', '协议']
摘要由CSDN通过智能技术生成

传送门:点击打开链接

题意:给你一棵树,然后Q个问题,每个问题询问有存在多少个f(u,v)等于s其中u<=v,f(u,v)表示节点u到节点v所有边的权值异或和

思路:这道题我觉得出的非常好,运用了位异或的一些妙用。f(u,v)=f(1,u)^f(1,v),因为假设u,v的lca是p,那么1~p这些节点都是公用的,这部分被异或了两次,就抵消了

然后对于Q次问题,假设某一次问题是s,则有s=f(u,v)=f(1,u)^f(1,v)。那么有f(1,v)=s^f(1,u),也就是说,如果我们DFS到节点u,算出了f(1,v),那么对于某一个s,我们就需要算出f(1,v)等于多少,然后再通过cnt数组知道f(1,v)有多少个,把这个值累加到s这个查询的答案中去,就这样DFS遍历完整个树,答案就离线处理完了。复杂度O(Q*N)

trick:当出现下面这种数据的时候

1
10
1 2 0
2 3 0
3 4 0
4 5 0
5 6 0
6 7 0
7 8 0
8 9 0
1
0

可以看出来,答案会等于n(n-1)/2,因为n最大是1e5,所以结果可能会爆int,要用long long保存

#include<map>
#include<set
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值