「模版」归并排序求逆序对

NOIP考前练一练模版

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
#include <iostream>
#include <cstdio>
#include <cctype>
#define DEBUG(x) std::cerr << #x << "=" << x << std::endl
inline int read() {
char ch = getchar(); int res = 0; int flag = 1;
for(; !isdigit(ch); ch = getchar()) if(ch == '-') flag = -1;
for(; isdigit(ch); ch = getchar()) res = (res << 3) + (res << 1) + ch - '0';
return (flag * res);
}
const int N_MAX = 100007;
int n, a[N_MAX], b[N_MAX];
long long ans;
void merge_sort(int l, int r) {
if(l == r) return;
int mid = (l + r) / 2;
merge_sort(l, mid), merge_sort(mid + 1, r);
int i = l; int j = mid + 1;
for(int k = l; k <= r; k ++) {
if(j > r || i <= mid && a[i] < a[j]) b[k] = a[i ++];
else b[k] = a[j ++], ans += mid - i + 1;
}
for(int k = l; k <= r; k ++) a[k] = b[k];
}
int main() {
for(int i = 1; i < 100007; i ++) a[i] = i;
for(int i = 1; i <= n; i ++) {
int x = read(); int y = read();
std::swap(a[x], a[y]);
}
merge_sort(1, N_MAX - 1);
printf("%lld\n", ans);
return 0;
}