数列中逆序对的数量
给定一个长度为 n的整数数列,计算数列中的逆序对的数量。
#include <iostream> using namespace std; const int N = 100010; int n, a[N]; long long sort (int l, int r) { if (l >= r) return 0; int mid = l + r >> 1; long long ans = sort(l, mid) + sort(mid + 1, r); int t[r - l + 1]; int i = l, j = mid + 1, k = 0; while (i <= mid && j <= r) { if (a[i] <= a[j]) t[k++] = a[i++]; else { ans += mid - i + 1; t[k++] = a[j++]; } } while (i <= mid) t[k++] = a[i++]; while (j <= r) t[k++] = a[j++]; k = 0; for (int i = l; i <= r; i++, k++) a[i] = t[k]; return ans; } int main() { scanf ("%d", &n); for (int i = 0; i < n; i++) scanf ("%d", &a[i]); long long ans = sort (0, n - 1); printf ("%lld", ans); return 0; }