题目描述
有一实数序列A[1]、A[2] 、A[3] 、……A[n-1] 、A[n] (n<10000),若i<j,并且A[i]>A[j],则称A[i]与A[j]构成了一个逆序对,求数列A中逆序对的个数。
例如,5 2 4 6 2 3 2 6,可以组成的逆序对有
(5 2),(5 4),(5 2),(5 3),(5 2),
(4 2),(4 3),(4 2),
(6 2),(6 3),(6 2),
(3 2)
共:12个
输入
共两行,第一行有一个正整数n,第二行有n个整数。
输出
只有一行为逆序对个数。
样例输入
8
5 2 4 6 2 3 2 6
样例输出
12
代码
#include<bits/stdc++.h>
using namespace std;
#define MAXN 10001
int n, a[MAXN],r[MAXN];
long long ans=0;
void MergSort(int s, int t)
{
if (s==t) return;
int m= (s+t)/2;
MergSort(s,m);
MergSort(m+1,t);
//到这步就是归并排序完成,左右都有序
int i=s;
int j=m+1;
int k=s;
while (i<=m && j<=t)
{
if (a[i]<=a[j])
r[k++]=a[i++];
else
{
ans+=m-i+1;
r[k++]=a[j++];
}
}
while (i<=m) r[k++]=a[i++];
while (j<=t) r[k++]=a[j++];
for (i=s;i<=t;i++) a[i]=r[i];
}
int main()
{
cin>>n;
for (int i=1;i<=n;i++) cin>>a[i];
MergSort(1,n);
cout<<ans;
}