题目
题目描述】
给定一个序列,如果存在
并且
,那么我们称之为逆序对,求逆序对的数目。
【输入】
第一行为n,表示序列长度,接下来的n行,第i+1行表示序列中的第i个数。
【输出】
所有逆序对总数。
【输入样例】
4
3
2
3
2
【输出样例】
3
【提示】
。
代码
#include<iostream>
using namespace std;
const int N = 100111;
long long ans = 0; //需要longlong,不然溢出
// 归并排序求逆序对
// 将a[first...mid]和a[mid+1...last]合并到r[first...last]中
void merge(int a[], int r[], int first, int mid, int last) {
int i = first, j = mid + 1, k = first;
while (i <= mid && j <= last) {
if (a[i] > a[j]) r[k++] = a[j++], ans += mid - i + 1;
else r[k++] = a[i++];
}
//拷贝剩余的数
while (i <= mid) r[k++] = a[i++];
while (j <= last) r[k++] = a[j++];
//拷贝到原数组
for (int i = first; i <= last; i++) a[i] = r[i];
}
// 归并排序
void mergesort(int a[], int r[], int first, int last) {
if (first >= last) return;
int mid = first + (last - first) / 2;
mergesort(a, r, first, mid);
mergesort(a, r, mid + 1, last);
merge(a, r, first, mid, last);
}
int a[N], tmp[N];
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) cin >> a[i];
mergesort(a, tmp, 0, n - 1);
cout << ans << endl;
return 0;
}