求排列的逆序數

2021-10-24 01:23:48 字數 1616 閱讀 7934

求排列的逆序數## 標題

1020:求排列的逆序數

檢視提交統計提問

總時間限制: 1000ms 記憶體限制: 65536kb

描述在internet上的搜尋引擎經常需要對資訊進行比較,比如可以通過某個人對一些事物的排名來估計他(或她)對各種不同資訊的興趣,從而實現個性化的服務。

對於不同的排名結果可以用逆序來評價它們之間的差異。考慮1,2,…,n的排列i1,i2,…,in,如果其中存在j,k,滿足 j < k 且 ij > ik, 那麼就稱(ij,ik)是這個排列的乙個逆序。

乙個排列含有逆序的個數稱為這個排列的逆序數。例如排列 263451 含有8個逆序(2,1),(6,3),(6,4),(6,5),(6,1),(3,1),(4,1),(5,1),因此該排列的逆序數就是8。顯然,由1,2,…,n 構成的所有n!個排列中,最小的逆序數是0,對應的排列就是1,2,…,n;最大的逆序數是n(n-1)/2,對應的排列就是n,(n-1),…,2,1。逆序數越大的排列與原始排列的差異度就越大。

現給定1,2,…,n的乙個排列,求它的逆序數。

輸入第一行是乙個整數n,表示該排列有n個數(n <= 100000)。

第二行是n個不同的正整數,之間以空格隔開,表示該排列。

輸出輸出該排列的逆序數。

樣例輸入

6

2 6 3 4 5 1

樣例輸出

提示

利用二分歸併排序演算法(分治);

注意結果可能超過int的範圍,需要用long long儲存。

解題思路

1.分治的思想是將整個事件分成多個事件,從最小的單元出發逐漸累積成整個事件。將樣例分成倒數第二小的單元就是【(26)(3)】【(45)(1)】,先讓最小單元2與6比,2,6分別與3比,右邊也是如此,然後2與4,5,1比,6與4,5,1比……

2.將子區間排序(小到大為例)。

3.小到大的遞迴就是歸併排序,當右邊的第乙個數比左邊的第乙個數小的時候,就說明右邊這個數比左邊第二個數往後的所有數都小,這就是逆序對→記錄s對數。將原陣列更新,下一次遞迴需要更新後的陣列(為保證不重不漏)。

#include

using

namespace std;

const

int max =

1e5+10;

int a[max]

,tmp[max]

,n;long

long s =0;

void

merge_sort

(int a,

int l,

int r)

else

}while

(i <= mid) tmp[k++

]= a[i++];

while

(j <= r) tmp[k++

]= a[j++];

/*將排好序的陣列存回a陣列 */

for(i = l, j =

0; i <= r; i++

, j++

) a[i]

= tmp[j];}

intmain()

求排列的逆序數

考慮1,2,n n 100000 的排列i1,i2,in,如果其中存在j,k,滿足 j k 且 ij ik,那麼就稱 ij,ik 是這個排列的乙個逆序。乙個排列含有逆序的個數稱為這個排列的逆序數。例如排列 263451 含有8個逆序 2,1 6,3 6,4 6,5 6,1 3,1 4,1 5,1 因...

求排列的逆序數

openjudge011 題目 乙個排列含有逆序的個數稱為這個排列的逆序數。例如排列 263451 含有8個逆序 2,1 6,3 6,4 6,5 6,1 3,1 4,1 5,1 因此該排列的逆序數就是8。顯然,由1,2,n 構成的所有n 個排列中,最小的逆序數是0,對應的排列就是1,2,n 最大的逆...

7622 求排列的逆序數

7622 求排列的逆序數 總時間限制 1000ms 記憶體限制 65536kb 描述 在internet上的搜尋引擎經常需要對資訊進行比較,比如可以通過某個人對一些事物的排名來估計他 或她 對各種不同資訊的興趣,從而實現個性化的服務。對於不同的排名結果可以用逆序來評價它們之間的差異。考慮1,2,n的...