逆序對距離之和
阿新 • • 發佈:2020-08-07
題目:
小易給定一個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)