题目来源:
题目大意:
通过交换两数位置对数列进行排序,求把一串数列化为有序的最小的交换次数。
解题思路:
归并排序求逆序对。
(同Brainman,只是格式和数据范围不一样)
P……Plus Ultra??(固有幻视x)
AC代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 500010
long long c[N], a[N];
long long ans;
void MergeSort(int l, int r)
{
int mid, l1, l2, i=l;
if (l<r)
{
mid = (l+r)/2;
MergeSort(l,mid);
MergeSort(mid+1,r);
l1 = l;
l2 = mid + 1;
while(l1<=mid || l2<=r)
{
if (l2>r || (l1<=mid && c[l1]<=c[l2]))
{
a[i] = c[l1];
i++;
l1++;
}
else
{
a[i] = c[l2];
i++;
l2++;
ans += mid+1-l1;
}
}
for (i=l;i<=r;i++)
{
c[i] = a[i];
}
}
}
int main()
{
int T, i;
while (scanf("%d",&T) && T)
{
ans = 0;
for (i=0;i<T;i++)
{
scanf("%lld",&c[i]);
}
MergeSort(0,T-1);
printf("%lld\n",ans);
}
return 0;
}