forked from duanjigui/Algorithms
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathReverse-Pair(Merge-Sort).cpp
More file actions
59 lines (53 loc) · 861 Bytes
/
Reverse-Pair(Merge-Sort).cpp
File metadata and controls
59 lines (53 loc) · 861 Bytes
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <cstdio>
#define INF 1000000000
#define ELEMENT_COUNT 100000
using namespace std;
int n, d[ELEMENT_COUNT], ans;
void merge(int o1, int l1, int o2, int l2)
{
static int a1[ELEMENT_COUNT], a2[ELEMENT_COUNT];
int k1 = 0, k2 = 0;
for (int i = 0; i < l1; i++)
{
a1[i] = d[i + o1];
}
a1[l1] = INF;
for (int i = 0; i < l2; i++)
{
a2[i] = d[i + o2];
}
a2[l2] = INF;
for (int i = 0; i < l1 + l2; i++)
{
if (a1[k1] <= a2[k2])
{
d[i + o1] = a1[k1++];
}
else
{
d[i + o1] = a2[k2++];
ans += (l1 - k1);
}
}
}
void merge_sort(int l, int r)
{
if (l < r)
{
int mid = (l + r) >> 1;
merge_sort(l, mid);
merge_sort(mid + 1, r);
merge(l, mid - l + 1, mid + 1, r - mid);
}
}
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d", &d[i]);
}
merge_sort(0, n - 1);
printf("%d", ans);
return 0;
}