The Number of Inversions
For a given sequence A={a0,a1,...an−1} , the number of pairs (i,j) where ai>aj and i<j , is called the number of inversions. The number of inversions is equal to the number of swaps of Bubble Sort defined in the following program:
bubbleSort(A) cnt = 0 // the number of inversions for i = 0 to A.length-1 for j = A.length-1 downto i+1 if A[j] < A[j-1] swap(A[j], A[j-1]) cnt++ return cnt
For the given sequence A , print the number of inversions of A . Note that you should not use the above program, which brings Time Limit Exceeded.
Input
In the first line, an integer n , the number of elements in A , is given. In the second line, the elements ai ( i=0,1,..n−1 ) are given separated by space characters.
output
Print the number of inversions in a line.
Constraints
- 1≤n≤200,000
- 0≤ai≤109
- ai are all different
Sample Input 1
5 3 5 2 1 4
Sample Output 1
6
Sample Input 2
3 3 1 2
Sample Output 2
2
这道题的坑点就是,下标以及统计次数sum都要用long类型,而不能用int,不然会WA,我感觉很奇怪,有的题20w的数据int可以放的下,有的却不行,希望大家知道原因的告诉我。
#include<iostream>
using namespace std;
typedef long long ll;
const long maxn=200005;
const ll maxv=1e9+5;
long sum=0;
void Merge(ll*a,long left,long mid,long right)
{
long n1=mid-left,n2=right-mid;
ll *L,*R;
L=new ll [n1+1];R=new ll [n2+1];
for(long i=0;i<n1;i++)
L[i]=a[left+i];
for(long j=0;j<n2;j++)
R[j]=a[mid+j];
L[n1]=R[n2]=maxv;
long m=0,n=0;
for(long i=left;i<right;i++)
{
if(L[m]<=R[n]){a[i]=L[m];m++;}
else
{
sum+=n1-m;
a[i]=R[n];
n++;
}
}
}
void Merge_Sort(ll*a,long left,long right)
{
if(left<right-1)
{
long mid=(left+right)/2;
Merge_Sort(a,left,mid);
Merge_Sort(a,mid,right);
Merge(a,left,mid,right);
}
}
int main()
{
long n;
ll a[maxn];
cin>>n;
for(long i=0;i<n;i++)
cin>>a[i];
Merge_Sort(a,0,n);
cout<<sum<<endl;
return 0;
}