归并排序求逆序数,注意逆序数可能有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; }