题目描述
一天,小马Pony和Rarity比赛算数。他们要求给定序列的中所包含的逆序对个数,请你设计程序帮助Rarity在比赛中胜过Pony。
逆序对,设 A 为一个有 n 个数字的有序集 (n>1),其中所有数字各不相同。如果存在正整数 i, j 使得 1 ≤ i < j ≤ n 而且 A[i] > A[j],则 这个有序对称为 A 的一个逆序对,也称作逆序数。
注意序列中可能有重复数字
输入格式
第一行,一个数 n,表示序列中有 n个数。
第二行,以空格分隔的 n个数,表示给定的序列。序列中每个数字不超过 10^9。
输出格式
一个数,序列中逆序对的数目 m。
输入输出样例
输入1
6
5 4 2 6 3 1
输出1
11
说明
对于 80% 的数据,n≤2000
对于 100% 的数据,n≤10^4。
样例程序:
ans = 0
a = []
def mergeSort(ls):
if len(ls) < 2:
return
mid = len(ls) // 2
ls1 = ls[0:mid]
ls2 = ls[mid:len(ls)+1]
mergeSort(ls1)
mergeSort(ls2)
merge(ls1, ls2, ls)
def merge(ls1, ls2, ls):
i = j = 0
while i + j < len(ls):
if j == len(ls2) or (i < len(ls1) and ls1[i] <= ls2[j]):
ls[i+j] = ls1[i]
i += 1
global ans
ans += j
else:
ls[i+j] = ls2[j]
j += 1
n = int(input())
a = list(map(int, input().split()))
mergeSort(a)
print(ans)
(本题目由武汉理工大学信息1802班 赵中雨 同学贡献,表示感谢!)