1. 程式人生 > 實用技巧 >逆序對距離之和

逆序對距離之和

題目:

小易給定一個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)