模板 - 算法基础 - 归并排序
归并排序求逆序数,注意逆序数可能有n^2级别。按照惯例,所有的自写函数均为闭区间。
ll MergeSort(int *a, int l, int r) {
if(l == r)
return 0;
int m = l + r >> 1;
ll res = 0;
res += MergeSort(a, l, m);
res += MergeSort(a, m + 1, r);
int i = l, j = m + 1, k = 0;
while(i <= m || j <= r) {
if(i > m)
tmp[++k] = a[j++];
else if(j > r)
tmp[++k] = a[i++];
else if(a[i] < a[j])
tmp[++k] = a[i++];
else {
res += m - i + 1;
tmp[++k] = a[j++];
}
}
for(int i = 1; i <= k; ++i)
a[l + i - 1] = tmp[i];
return res;
}