給定長度 n < 500,000 的排列,求將其排序所需的最少相鄰交換次數(即逆序數)。多測試用例,n=0 結束。
[l, r] 為 [l, mid] 和 [mid+1, r]。a[i] > a[j](i 在左,j 在右),則 a[i..mid] 都大於 a[j],產生 mid - i + 1 個逆序對。
const int MAX = 500005;
int a[MAX]; long long ans;
void merge(int l, int mid, int r) {
int i=l, j=mid+1;
while(i<=mid && j<=r) {
if(a[i] <= a[j]) i++;
else { j++; ans += mid - i + 1; }
}
sort(a+l, a+r+1); // 或手寫 merge 到臨時數組再拷回
}
void merge_sort(int l, int r) {
if(l
sort 的 O(n log n) 開銷,將合併降為 O(n),總體 O(n log n)。long long 存儲答案(最大 ~1.25e11)。