半年没写树剖了,就当模板练一下
首先设根节点到 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)<&