题目描述
一天,小马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 = 0a = []def mergeSort(ls):if len(ls) < 2:returnmid = len(ls) // 2ls1 = ls[0:mid]ls2 = ls[mid:len(ls)+1]mergeSort(ls1)mergeSort(ls2)merge(ls1, ls2, ls)def merge(ls1, ls2, ls):i = j = 0while i + j < len(ls):if j == len(ls2) or (i < len(ls1) and ls1[i] <= ls2[j]):ls[i+j] = ls1[i]i += 1global ansans += jelse:ls[i+j] = ls2[j]j += 1n = int(input())a = list(map(int, input().split()))mergeSort(a)print(ans)
(本题目由武汉理工大学信息1802班 赵中雨 同学贡献,表示感谢!)
