显然的线段树合并。
注意到交换左右子树只会影响当前结点的贡献,而其祖先并未受到影响。
考虑合并左右儿子的线段树时的贡献。
考虑线段树上分治 [l,r] 区间,即计算跨过 mid=⌊l+r2⌋ 的贡献数。
如果不交换,就是左边儿子 [mid+1,r] 内的点数乘上右边儿子 [l,mid] 内的点数;
如果交换了,就是左边儿子 [l,mid] 内的点数乘上右边儿子 [mid+1,r] 内的点数。
发现这个可以在线段树合并时同时执行,毕竟本质是基于线段树结构的算法。
于是这题就做完了。
代码:
1 |
|