分块 + 树状数组处理动态逆序对.
先用树状数组扫一遍,算出初始的答案,考虑交换 $a_x,a_y(x<y)$ 对答案造成的影响.
$a_x$ 与 $a_y$ 的贡献, $a_x$ 与 $[x+1,y-1]$ 内元素的贡献,以及 $a_y$ 与 $[x+1,y-1]$ 内元素的贡献需要重新计算.
可以先把原来的贡献减掉,重新计算后加回去,于是问题转化为求一个元素与一段区间内的元素产生的贡献.
考虑分块,对每一块开两个树状数组,分别维护该块内 $\le i$ 的元素数目,以及它们的权值和.
询问贡献时,边角暴力,整块的在树状数组中查询,每次修改最多会影响两个块,在对应的树状数组中直接改即可.
时间复杂度 $O(n\sqrt n\log n)$ ,空间复杂度 $O(n\sqrt n)$ .
1 | //%std |