转化成给每个
i 赋
bi=0/1 的权值,
bi=1 代表
ai 要加 INF,答案就是最终序列的逆序对数。考虑按照
ai 从大到小赋值并确定在最终序列里的排名,每个时刻已经确定的排名都形如
...000..111。
若
bi=1,则将
i 插入最后一个
1 之前, 这同时意味着所有满足
j>i,aj<ai 的位置都会形成逆序对,因为最终序列中
i 之后不可能再插入新的数。同理,若
bi=0,将
i 插入第一个
0 之前,
i 与所有满足
j<i,ai<aj 的位置形成逆序对。
令
S 为
bi=1 的
i 构成的集合。
这里有一个关键结论,
∀i<j,bi=1,bj=0→ai<aj。严格证明的话,找到最近的点对
i,j,使得
bi=1,bj=0,ai>aj,调整为
bi=0,bj=1,将
(x,ax) 画在二维平面上,则
(i,ai),(j,aj) 为顶点向上/下/左/右画出的射线可以将平面划分成
9 个区域,因为
i,j 为最近点对,所以中间区域没有点。然后分别讨论其余
8 个区域内的点跟
i,j 形成的逆序对数变化量,四个角上的区域变化量为
0,剩下的区域也能分讨出变化量
≤0,可以证明是更优的。
于是可能的逆序对
(i,j) 共有
3 种情况:
- ai>aj,bi=0,bj=0
- ai>aj,bi=1,bj=1
- ai<aj,bi=1,bj=0
令
fi=∑j=1i−1[aj>ai],gi=∑j=i+1n[aj<ai]。
根据题解第二段的内容,若
bi=0,对逆序对数贡献
fi,若
bi=1,对逆序对数贡献
gi。发现少算了情况
3,那么再令
bi=1 时额外加上
n−i,这样会多算情况
2 和
ai<aj,bi=1,bj=1,也就是
(2∣S∣)。因为贡献之间独立,于是一开始令
∣S∣ 为
0,增量扩大
S,这样就能减掉
(2∣S∣)。
复杂度
O(nlogn)。