问题可转化为求逆序对数,感觉用O(N^2)的排序算法会超时,没试过,我是用的归并排序,在排序的同时统计逆序对,注意merge的时候那个统计的逻辑,还有结果用long long 存,否则溢出,这题暂时排名第一,感觉良好,哈哈
#include<stdio.h>
#include<string.h>
static int array[500000];
static long long res;
static void merge(int *a, int begin, int mid, int end)
{
int i = begin, j = mid + 1, index = 0;
while (i <= mid && j <= end)
if (a[i] <= a[j])
array[index++] = a[i++];
else
{
array[index++] = a[j++];
res += mid - i + 1;//main point!!!
}
if (i > mid)
while (j <= end)
array[index++] = a[j++];
if (j > end)
while (i <= mid)
array[index++] = a[i++];
memcpy(a + begin, array, index * sizeof(int));
}
static void merge_sort(int *a, int begin, int end)
{
if (begin == end)
return;
else if (begin + 1 == end)
{
if (a[begin] > a[end])
{
int temp = a[begin];
a[begin] = a[end];
a[end] = temp;
res++;
}
}
else
{
int mid = (begin + end) / 2;
merge_sort(a, begin, mid);
merge_sort(a, mid + 1, end);
merge(a, begin, mid, end);
}
}
int main()
{
int n, a[500000];
while (scanf("%d", &n), n)
{
int i;
for (i = 0; i < n; i++)
scanf("%d", &a[i]);
res = 0;
merge_sort(a, 0, n - 1);
printf("%lld\n", res);
}
return 0;
}