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

2021-10-07 21:26:25 字數 1344 閱讀 8038

逆序對的定義如下:對於數列的第 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 個元素,...