归并排序与逆序对计数

逆序对:给定数组中满足i < j && a[i] > a[j]的对数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
ll mergeAndCount(vector<ll> &arr, ll l, ll m, ll r)
{
vector<ll> temp(r - l + 1);
ll invCount = 0;
ll i = l, j = m + 1, k = 0;
while (i <= m && j <= r)
{
if (arr[i] <= arr[j])
temp[k++] = arr[i++];
else
{
temp[k++] = arr[j++];
invCount += m - i + 1;
}
}
while (i <= m)
temp[k++] = arr[i++];
while (j <= r)
temp[k++] = arr[j++];
for (ll p = 0; p < temp.size(); p++)
arr[l + p] = temp[p];
return invCount;
}

ll mergeSortAndCount(vector<ll> &arr, ll l, ll r)
{
ll invCount = 0;
if (l < r)
{
ll m = l + (r - l) / 2;
invCount += mergeSortAndCount(arr, l, m);
invCount += mergeSortAndCount(arr, m + 1, r);
invCount += mergeAndCount(arr, l, m, r);
}
return invCount;
}

int main(){
ll n;cin >> n;
vector<ll> arr(n);
for(auto& i:arr)cin >> i;
cout << mergeSortAndCount(arr, 0, n - 1) << endl;
}