题目链接
这个问题很容易想到之间的关系,假设现在所要查询的这条链上有V1、V2、…… VK个点,那么第i个点的贡献在抑或中出现的次数XOR为
- 当K为偶数时候,F(i)恒定为奇数
- 当K为奇数的时候,F(i)在i为偶数的时候F(i)为奇数
- 只有F(i)为奇数的时候,在抑或XOR中才有作用
于是,如果K为偶数的时候,我们直接求这条链上所有值的抑或XOR和即可,树链剖分就可以很好的维护了。
如果K为奇数的时候,我们需要求第2、4、6、……这几个偶数点的抑或XOR和。如果我们直接在线段树上维护当然是不行的,因为dfs序号是没有这样的独立性的,可能会有两个同时为偶数dfs序的点却是连接在一起的。
所以考虑深度,会发现,深度奇偶不同的点一定是不相连接的,并且中间只隔了一个点。于是,我们这里开两个线段树,维护一下每个奇偶深度的抑或XOR和。
这样,我们查询的时候,只用查询于两个结点的deep的奇偶不同的点的抑或和即可。
因为是奇数个点,所以也代表了两个查询结点一定是在深度上同奇偶。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include