ACWing 788 逆序對的數量

2021-10-19 09:27:26 字數 1411 閱讀 1765

給定乙個長n

nn的數列,計算其逆序對數量。

輸入格式:

第一行包含整數n

nn,表示數列的長度。第二行包含n

nn個整數,表示整個數列。

輸出格式:

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

資料範圍:

1 ≤n

≤100000

1\le n\le 100000

1≤n≤10

0000

思路是歸併排序(分治)。先累加左右兩邊的逆序對數量,然後做二路歸併的時候,順便計算跨越兩邊的逆序對數量。由於左右兩半邊已經排好序了,計算跨越兩邊的逆序對數量變得很簡單。當右半邊的指標i

ii指向的數y

yy小於左半邊指標j

jj指向的數x

xx的時候,就可以累加以y

yy為第二個數的逆序對數列,就是m−i

+1

m-i+1

m−i+1,m

mm是左半邊的最後乙個數的下標。**如下:

#include

using

namespace std;

const

int n =

100010

;int n;

int a[n]

, tmp[n]

;// 答案要用long來存

long

merge_sort

(int l,

int r)

int m = l +

(r - l >>1)

;long res =0;

// 累加左右兩邊逆序對的個數

res +

=merge_sort

(l, m)

; res +

=merge_sort

(m +

1, r)

;// 接下來算跨越兩邊的逆序對個數,並把a[l : r]排好序

int i = l, j = m +

1, idx = l;

while

(i <= m && j <= r)

else

}while

(i <= m) tmp[idx++

]= a[i++];

while

(j <= r) tmp[idx++

]= a[j++];

for(i = l; i <= r; i++

) a[i]

= tmp[i]

;return res;

}int

main()

時間複雜度o(n

log⁡n)

o(n\log n)

o(nlogn)

,空間o(n

)o(n)

o(n)

AcWing 788 逆序對的數量

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

題解 AcWing 788 逆序對的數量

acwing 788.逆序對的數量 看了大佬的題解後對於歸併又有了更深的理解,在這裡引用一下dongwa zzuli大佬的題解acwing 788.逆序對的數量,感興趣的小夥伴可以看看 給定乙個長度為n的整數數列,請你計算數列中的逆序對的數量。逆序對的定義如下 對於數列的第 i 個和第 j 個元素,...

AcWing 788 逆序對的數量(C 演算法)

逆序對的定義如下 對於數列的第 i 個和第 j 個元素,如果滿足 i j 且 a i a j 則其為乙個逆序對 否則不是。輸入格式 第一行包含整數n,表示數列的長度。第二行包含 n 個整數,表示整個數列。輸出格式 輸出乙個整數,表示逆序對的個數。資料範圍 1 n 100000 輸入樣例 62 3 4...