1019 逆序数
在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。
如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序数是4。给出一个整数序列,求该序列的逆序数。
Input
第1行:N,N为序列的长度(n <= 50000)
第2 - N + 1行:序列中的元素(0 <= A[i] <= 10^9)
Output
输出逆序数
Input示例
4
2
4
3
1
Output示例
4
这道题看了大佬的解题方法,感觉特别玄妙。大佬用的是归并排序解题,一边排序的同时一边计算出逆序对的数目。这里适当修改了一下归并排序的模板,python3代码如下:
def Mergearray(A, left, right):
mid = (left+right)>>1
i, j = left, mid+1
B = []
global ans
while i <= mid and j <= right:
if A[i] <= A[j]:
B.append(A[i])
i += 1
else:
B.append(A[j])
j += 1
#当后一半的区间里有数据插入前一半区间时候,定有逆序数
ans += mid - i + 1 #核心代码,统计逆序数
while i <= mid:
B.append(A[i])
i += 1
while j <= right:
B.append(A[j])
j += 1
for i in range(len(B)):
A[left+i] = B[i]
def Mergesort(A, left, right):
if left < right:
mid = (left+right)>>1
Mergesort(A, left, mid)
Mergesort(A, mid+1, right)
Mergearray(A, left, right)
while True:
try:
n = int(input())
A = []
ans = 0
for i in range(n):
A.append(int(input()))
Mergesort(A, 0, len(A)-1)
print(ans)
except EOFError:
break
这段python代码太慢了,在51nod上运行用了1000多ms,而C只用了100多ms。