题目解析
若考虑所有球的颜色都互不相同,那么本题就变为了一道经典的「逆序对」问题。
那么我们可以考虑先求出整个序列 XXX 的「逆序对」的数量,在考虑如何消除相同元素的球进行交换对答案产生的影响即可。
对于颜色同为 CiC_iCi 的 MiM_iMi 个球对应的整数序列为 Xp1,Xp2,⋯ ,XpMX_{p_1}, X_{p_2}, \cdots, X_{p_M}Xp1 ,Xp2 ,⋯,XpM 。
令其排序以后的序列为 Xp1′,Xp2′,⋯ ,XpM′X_{p_1}', X_{p_2}', \cdots, X_{p_M}'Xp1 ′ ,Xp2 ′ ,⋯,XpM ′ 。
那么求出上述序列的「逆序对」数量,并将其在最终的答案中减去即可。
在实现上,我们只需要创建一个「树状数组」,然后将球上的数字按照颜色分组。
对于每组内的数字,球的颜色都是相同的,所以我们对于这个序列求逆序对,在总答案中减去即可;
在结束后,可以再遍历一遍组内的数字,消除求逆序对的过程中对树状数组产生的影响。
然后我们再对整个数组求逆序对,便可得到最终的答案。
以上两个步骤的时间复杂度皆为 O(NlogN)\mathrm{O}(N\log{N})O(NlogN)。
> 对于 Python\tt{Python}Python 而言一个可以优化的点是,倒序处理,这样每次查找就变成了“小于当前 x 的数量”,这样树状数组可以少做一半的 ask() 运算。
AC代码
C++ 代码:
Python 代码: