給定乙個長度為n的整數數列,請你計算數列中的逆序對的數量。
逆序對的定義如下:對於數列的第 i 個和第 j 個元素,如果滿足 i < j 且 a[i] > a[j],則其為乙個逆序對;否則不是。
輸入格式
第一行包含整數n,表示數列的長度。
第二行包含 n 個整數,表示整個數列。
輸出格式
輸出乙個整數,表示逆序對的個數。
資料範圍
1≤n≤100000
輸入樣例:
62 3 4 5 6 1
輸出樣例:
5思路
利用歸併排序將可能的情況分成三種
①左半邊陣列逆序對的數量:merge_sort(l , mid)
②右半邊陣列逆序對的數量: merge_sort(mid + 1 , r )
③左邊陣列值比右邊陣列大的逆序對數量:mid -i + 1(因為半邊陣列已經是排好序的,如果q[i]>q[j],那麼左半邊陣列i後面的數也和j形成逆序對)
#include
using
namespace std;
const
int n =
100010
;typedef
long
long ll;
int q[n]
,tmp[n]
;int n;
ll merge_sort
(int q,
int l ,
int r)
}while
(i <= mid) tmp[k++
]= q[i++];
while
(j <= r) tmp[k++
]= q[j++];
for(
int i = l , j =
0; i <= r ; i++
,j++
) q[i]
= tmp[j]
;return cnt;
}int
main()
逆序對的數量
題目描述 給定乙個長度為n的整數數列,請你計算數列中的逆序對的數量。逆序對的定義如下 對於數列的第 i 個和第 j 個元素,如果滿足 i j 且 a i a j 則其為乙個逆序對 否則不是。輸入格式 第一行包含整數n,表示數列的長度。第二行包含 n 個整數,表示整個數列。輸出格式 輸出乙個整數,表示...
788 逆序對的數量
給定乙個長度為n的整數數列,請你計算數列中的逆序對的數量。逆序對的定義如下 對於數列的第 i 個和第 j 個元素,如果滿足i j 且 a i a j 則其為乙個逆序對 否則不是。第一行包含整數n,表示數列的長度。第二行包含 n 個整數,表示整個數列。輸出乙個整數,表示逆序對的個數。1 n 10000...
788 逆序對的數量
題目描述 給定乙個長度為n的整數數列,請你計算數列中的逆序對的數量。逆序對的定義如下 對於數列的第 i 個和第 j 個元素,如果滿足 i j 且 a i a j 則其為乙個逆序對 否則不是。輸入格式 第一行包含整數n,表示數列的長度。第二行包含 n 個整數,表示整個數列。輸出格式 輸出乙個整數,表示...