这是本文档旧的修订版!
总结时用到的博客:
https://blog.csdn.net/qq_39759315/article/details/88553210
https://www.cnblogs.com/RabbitHu/p/MoDuiTutorial.html
首先需要解决$bzoj1086$王室联邦,此题的解法即为分块的方法
下只简述过程,每块内的节点个数在$[B,3B]$之间,操作方式为维护一个栈,从根节点开始$dfs$,对于某一点$x$:
最后栈中剩余的点加入最后一个块中
T(v, u) = S(root, v) xor S(root, u)
观察将curV移动到targetV前后T(curV, curU)变化:
T(curV, curU) = S(root, curV) xor S(root, curU)
T(targetV, curU) = S(root, targetV) xor S(root, curU)
取对称差:
T(curV, curU) xor T(targetV, curU)= (S(root, curV) xor S(root, curU)) xor (S(root, targetV) xor S(root, curU))
由于对称差的交换律、结合律:
T(curV, curU) xor T(targetV, curU)= S(root, curV) xor S(root, targetV)
两边同时xor T(curV, curU):
T(targetV, curU)= T(curV, curU) xor S(root, curV) xor S(root, targetV)
发现最后两项很爽……哇哈哈
T(targetV, curU)= T(curV, curU) xor T(curV, targetV)
总结一下树上的操作和序列的不同点