給定乙個長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
logn)
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...