ZOJ-2386

来源:互联网 发布:matlab 矩阵变cell 编辑:程序博客网 时间:2024/05/16 13:07

问题可转化为求逆序对数,感觉用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;}


0 0