归并排序求逆序数对
#include <stdio.h>
#define esp 1e-8
#include <string.h>
#include <algorithm>
using namespace std;
int m[1005];//存数空间
int t[1005];
int ans;
void hebing(int s,int mid,int e)
{
int i = s;
int j = mid +1;
int k = 0;
//辅助空间
while (i<=mid&&j<=e)//先将一边排完
{
if(m[i]>m[j])
{
ans+=mid-i+1;
t[k++]=m[j++];
}
else
{
t[k++] = m [i++];
}
}
while (i<=mid)
{
t[k++] = m [i++];
}
while (j<=e)
{
t[k++] = m [j++];
}
for (i = 0; i < k ; i++)
{
m[s+i] = t[i];
}
}
void erfen(int s , int e)
{
if (s<e)
{
int mid = s + (e-s) / 2;
erfen(s,mid);
erfen(mid+1,e);
hebing(s,mid,e);
}
}
int main()
{
int i,n,k;
scanf("%d",&n);
for (i=0;i<n;i++)
{
memset(m,0,sizeof(int));
ans = 0;
scanf("%d",&k);
for (int j = 0;j<k ;j++)
{
scanf("%d",&m[j]);
}
erfen(0,k-1);
printf("Scenario #%d:\n%d\n\n",i+1,ans);
}
return 0;
}