题解 luoguP3401 【洛谷树】

传送门

半年没写树剖了,就当模板练一下

首先设根节点到 i i i路径上的异或和为 v a l [ i ] val[i] val[i],则 i i i j j j路径的异或和为 v a l [ i ] ⊕ v a l [ j ] val[i]\oplus val[j] val[i]val[j]

对于 i i i j j j所有子路径的异或和的和,对每一位分开来考虑,对于第 i i i位,发现贡献就是 ( 1 < < i ) × g s ( 0 ) × g s ( 1 ) (1<<i)\times gs(0)\times gs(1) (1<<i)×gs(0)×gs(1),其中 g s ( x ) gs(x) gs(x) i i i j j j路径上 x x x的个数。

g s ( 0 / 1 ) gs(0/1) gs(0/1)显然可以树剖 + + +线段树维护,对于一次修改,直接翻转子树内的 0 , 1 0,1 0,1个数即可,用树剖 + + +线段树可以轻松维护。

C o d e   B e l o w : Code\ Below: Code Below:

#include<bits/stdc++.h>
#define ts cout<<"ok"<<endl
#define int long long
#define hh puts("")
#define pc putchar
#define ls(x) ((x)<<1)
#define rs(x) ((x)<&
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值