逆序对计数
【问题描述】
对于给定的数组A,计算其逆序对的总数。即:
image.png
【输入形式】
输入包含1组测试用例。
一个测试用例占一行,第一个整数表示数组的长度,后面紧跟者数组中的各个整数元素,中间都用一个空格分开。
数组的长度范围
每个数字A[i]的范围为
【输出形式】
输出一个整数,表示逆序对的个数。
【样例输入】
5 1 2 3 5 4
【样例输出】
4
代码实现:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int ans;
void merge(int a[], int l, int mid, int r) {
int i=l, j=mid+1, k=l, temp[10010];
while ((i<=mid) && (j<=r))
if (a[i] <= a[j]) temp[k++] = a[i++];
else {
temp[k++] = a[j++];
ans += mid-i+1;
}
if (i > mid)
for(int q=j; q<=r; q++)
temp[k++] = a[q];
else
for(int q=i; q<=mid; q++)
temp[k++] = a[q];
for(int p=l; p<=r; p++) a[p] = temp[p];
}
void merge_sort(int a[], int l, int r) {
if(l >= r) return;
else {
int mid = (l + r) / 2;
merge_sort(a, l, mid);
merge_sort(a, mid+1, r);
merge(a, l, mid, r);
}
}
int main() {
int n, a[10010];
scanf("%d", &n);
for(int i=0; i<n; i++) scanf("%d", a+i);
merge_sort(a, 0, n-1);
printf("%d\n", ans);
}