AcWing 788. 逆序对的数量-python3
原题链接
简单
作者:
Actor丶
,
2020-03-08 09:31:39
,
所有人可见
,
阅读 609
"""
基本思想:
借助归并排序模板,在合并过程中:
1. 如果nums[i]<=nums[j],即nums[i]与nums[j]没有构成逆序对,则正常进行合并操作
2. 如果左半部分的nums[i]>右半部分的nums[j],那么i后面的元素都大于nums[j],即逆序对个数为(mid-i+1)
"""
def mergeSort(l, r):
if l>=r: return 0 # 如果子数组里有之多一个元素,那么逆序对个数为0
mid = (l+r)//2
res = mergeSort(l, mid) + mergeSort(mid+1, r)
k = 0
i = l
j = mid+1
while i<=mid and j<=r:
if nums[i]<=nums[j]: # nums[i]与nums[j]没有构成逆序对
tmp[k] = nums[i]
k+=1
i+=1
else: # 如果左半部分的nums[i]>右半部分的nums[j],那么i后面的元素都大于nums[j],即逆序对个数为(mid-i+1)
res += mid-i+1
tmp[k] = nums[j]
k+=1
j+=1
while i<= mid:
tmp[k] = nums[i]
k+=1
i+=1
while j<=r:
tmp[k] = nums[j]
k+=1
j+=1
i = l
j = 0
while i<=r:
nums[i] = tmp[j]
j+=1
i+=1
return res
if __name__=="__main__":
n = int(input().strip())
nums = list(map(int, input().split()))
tmp = [0]*n
res = mergeSort(0,n-1)
print(res)