演算法 逆序對的數量

2021-10-17 11:14:11 字數 1050 閱讀 9975

給定乙個長度為n的整數數列,請你計算數列中的逆序對的數量。

逆序對的定義如下:對於數列的第 i 個和第 j 個元素,如果滿足 i < j 且 a[i] > a[j],則其為乙個逆序對;否則不是。

輸入格式

第一行包含整數n,表示數列的長度。

第二行包含 n 個整數,表示整個數列。

輸出格式

輸出乙個整數,表示逆序對的個數。

資料範圍

1≤n≤100000

輸入樣例:

62 3 4 5 6 1

輸出樣例:

5思路

利用歸併排序將可能的情況分成三種

①左半邊陣列逆序對的數量:merge_sort(l , mid)

②右半邊陣列逆序對的數量: merge_sort(mid + 1 , r )

③左邊陣列值比右邊陣列大的逆序對數量:mid -i + 1(因為半邊陣列已經是排好序的,如果q[i]>q[j],那麼左半邊陣列i後面的數也和j形成逆序對)

#include

using

namespace std;

const

int n =

100010

;typedef

long

long ll;

int q[n]

,tmp[n]

;int n;

ll merge_sort

(int q,

int l ,

int r)

}while

(i <= mid) tmp[k++

]= q[i++];

while

(j <= r) tmp[k++

]= q[j++];

for(

int i = l , j =

0; i <= r ; i++

,j++

) q[i]

= tmp[j]

;return cnt;

}int

main()

逆序對的數量

題目描述 給定乙個長度為n的整數數列,請你計算數列中的逆序對的數量。逆序對的定義如下 對於數列的第 i 個和第 j 個元素,如果滿足 i j 且 a i a j 則其為乙個逆序對 否則不是。輸入格式 第一行包含整數n,表示數列的長度。第二行包含 n 個整數,表示整個數列。輸出格式 輸出乙個整數,表示...

788 逆序對的數量

給定乙個長度為n的整數數列,請你計算數列中的逆序對的數量。逆序對的定義如下 對於數列的第 i 個和第 j 個元素,如果滿足i j 且 a i a j 則其為乙個逆序對 否則不是。第一行包含整數n,表示數列的長度。第二行包含 n 個整數,表示整個數列。輸出乙個整數,表示逆序對的個數。1 n 10000...

788 逆序對的數量

題目描述 給定乙個長度為n的整數數列,請你計算數列中的逆序對的數量。逆序對的定義如下 對於數列的第 i 個和第 j 個元素,如果滿足 i j 且 a i a j 則其為乙個逆序對 否則不是。輸入格式 第一行包含整數n,表示數列的長度。第二行包含 n 個整數,表示整個數列。輸出格式 輸出乙個整數,表示...