逆序對的定義如下:對於數列的第 i 個和第 j 個元素,如果滿足 i < j 且 a[i] > a[j],則其為乙個逆序對;否則不是。
輸入格式
第一行包含整數n,表示數列的長度。
第二行包含 n 個整數,表示整個數列。
輸出格式
輸出乙個整數,表示逆序對的個數。
資料範圍
1≤n≤100000
輸入樣例:
62 3 4 5 6 1
輸出樣例:
52、基本思想:
假設乙個函式merge_sort已經能求出逆序對的數量,若將這組數平分為左右兩個部分,則:
逆序對的數量=左側數內部逆序對的數量+右側數內部逆序對的數量+右側每個數與左側數組成的逆序對數量的和
至於為什麼要在找逆序對的時候排好序,是因為j之前比它大的數都找出來了,及時它比後面的大,但它被重新放到前面,它還是比後面的大,不影響。
3、步驟:
①分為兩組,將左右逆序對數量先加總
②歸併的同時累加求同在左右兩邊的逆序對數量
#include
using
namespace std;
typedef
long
long ll;
//long long比較長寫起來比較麻煩,故用typedef
ll merge_sort
(int l,
int r)
;//該函式的功能為直接返回逆序對個數
const
int n =
1e5+10;
int q[n]
, n, a[n]
;int
main()
ll merge_sort
(int l,
int r)
}while
(i<=mid) a[k++
]= q[i++];
//掃尾
while
(j<=r) a[k++
]= q[j++];
//掃尾
for(i = l, k =
0; i<=r;
) q[i++
]= a[k++];
//歸還陣列元素
return count;
//返回逆序對個數
}//該**引用acwing**的**
注意事項:
題目中1≤n≤100000,求得的第三種逆序對個數大概是(1+2+3+…+n-1)可能超過int的資料範圍,故用long long
ACWing 788 逆序對的數量
給定乙個長n nn的數列,計算其逆序對數量。輸入格式 第一行包含整數n nn,表示數列的長度。第二行包含n nn個整數,表示整個數列。輸出格式 輸出乙個整數,表示逆序對的個數。資料範圍 1 n 100000 1 le n le 100000 1 n 10 0000 思路是歸併排序 分治 先累加左右兩...
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 個元素,...