, , . .
:
Easy - return 0 inversion, 1
:
.
, . ? (i, j) ( ), , j ( , < j). , ( j ).
? ( ). left [i] , right [j] [i]
. , left [i] , , j , left [i] ( [i]). , , left [i] , j.
#include <stdio.h>
long long int MS(int a[],int temp[],int left,int right);
long long int Merge(int a[],int temp[],int left,int mid,int right);
long long int MS(int a[],int temp[],int left,int right)
{
long long int cnt=0;
int mid;
if(right>left)
{
mid=(right+left)/2;
cnt=MS(a,temp,left,mid);
cnt+=MS(a,temp,mid+1,right);
cnt+=Merge(a,temp,left,mid+1,right);
}
return cnt;
}
long long int Merge(int a[],int temp[],int left,int mid,int right)
{
int i,j,k;
long long int cnt=0;
i=left;
j=mid;
k=left;
while(i<=mid-1 && j<=right)
{
if(a[i]<=a[j])
temp[k++] = a[i++];
else
{
temp[k++] = a[j++];
cnt+=(mid-i);
}
}
while (i<=mid-1)
temp[k++]=a[i++];
while(j<=right)
temp[k++]=a[j++];
for(i=left;i<=right;i++)
a[i]=temp[i];
return cnt;
}
int main()
{
int *a,*tmp,t,n;
scanf("%d",&t);
for(int i=0;i<t;i++)
{
scanf("%d",&n);
a=new int [n];
tmp=new int [n];
for(int j=0;j<n;j++)
scanf("%d",&a[j]);
printf("%lld\n",MS(a,tmp,0,n-1));
}
return 0;
}