逆序对距离之和

题目:

小易给定一个1到n的排列,希望你能求出这个序列中所有逆序对的距离和。
下标i,j的距离为|i-j|,逆序对是指序列中一对下标i,j满足i<j且ai>aj.

输入描述:
第一行数字n表示排列长度
接下来一行n个数字表示这个排列

1≤n≤100000

输出描述:
一行一个数字表示答案

 

输入例子1:
5
1 3 4 2 5

输出例子1:
3

 

例子说明1:
逆序对:
(3, 2)距离为2
(4, 2)距离为1
总和为3

 

参考:

思路:归并排序的同时记录和,直接暴力法不可取,复杂度过高

n = int(input())
nums = list(map(int, input().split()))
ans = 0
def mergesort(l):
    global ans
    L = len(l)
 
    if L <= 1:
        return l
 
    mid = L // 2
    left = mergesort(l[0:mid])
    right = mergesort(l[mid:])
    res = []
     
    sum_left = sum(left) if left else 0
    while left and right:
        if right[0] < left[0]:
            ans += sum_left - len(left) * right[0]
            res.append(right[0])
            right.pop(0)
        else:
            sum_left -= left[0]
            res.append(left[0])
            left.pop(0)
    if left:
        res += left
    elif right:
        res += right
 
    return res
 
mergesort(nums)
 
print(ans)

 

posted @ 2020-08-06 22:24  Andy_George  阅读(408)  评论(0编辑  收藏  举报