題目鏈結
給定乙個長度為n的整數數列,請你計算數列中的逆序對的數量。
逆序對的定義如下:對於數列的第 i 個和第 j 個元素,如果滿足 i < j 且 a[i] > a[j],則其為乙個逆序對;否則不是。
第一行包含整數n,表示數列的長度。
第二行包含 n 個整數,表示整個數列。
輸出乙個整數,表示逆序對的個數。
資料範圍
1≤n≤100000
62 3 4 5 6 1
我們可以用歸併排序來進行操作.在歸併的同時,我們發現如果乙個數不符合順序的話,他肯定會小於左邊後續的數,所以我們就可以計算出數量,在排序完成時,也實現了計數.
#include
#include
#include
using namespace std;
const
int maxn=
1e5+5;
typedef
long
long ll;
int a[maxn]
,q[maxn]
;int n;
ll merge_sort
(int a,
int l,
int r)
}while
(i<=mid) q[cnt++
]=a[i++];
while
(j<=r) q[cnt++
]=a[j++];
for(
int i=l,j=
0;i<=r;i++
,j++
)return res;
}int
main()
歸併排序 逆序對的數量
傳送門 輸入樣例 62 3 4 5 6 1 輸出樣例 5思路 利用歸併排序的思維統計逆序對的數量,可分為三種情況。實現 include using namespace std typedef long long ll const int maxn 1e6 5 int n int q maxn tmp...
逆序對 模擬歸併排序
逆序數的定義 如果 i j 且a i a j 則a i 和a j 即為逆序數對 給一列數,求它的逆序對數,即有多少個有序對 i.j 使得i在歸併排序的基礎上記上了乙個逆序對個數的統計 ans mid i 1 void merge int arr,int left,int mid,int right ...
C 逆序對的數量(歸併排序)
給定乙個長度為n的整數數列,請你計算數列中的逆序對的數量。逆序對的定義如下 對於數列的第 i 個和第 j 個元素,如果滿足 i j 且 a i a j 則其為乙個逆序對 否則不是。輸入格式 第一行包含整數n,表示數列的長度。第二行包含 n 個整數,表示整個數列。輸出格式 輸出乙個整數,表示逆序對的個...