POJ-Ultra-QuickSort 归并排序求逆序对

这题树状数组加离散化TLE,归并排序却过了。

代码如下:

#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <iostream>
#define MAXN 500005
using namespace std;

int N, a[MAXN], c[MAXN];
long long ans;

void merge_sort(int l, int r)
{
    if (r > l) {
        int mid = (l+r) >> 1;
        merge_sort(l, mid);
        merge_sort(mid+1, r);
        int i, j, k;
        for (i = l, j = mid+1, k = 0;i <= mid && j <= r;) {
            if (a[i] > a[j]) {
                c[k] = a[j];
                ans += (mid-i+1);
                ++j, ++k;
            }
            else {
                c[k] = a[i];
                ++i, ++k;
            }
        }
        for (int h = i; h <= mid; ++h) {
            c[k++] = a[h];
        }
        for (int h = j; h <= r; ++h) {
            c[k++] = a[h];
        }
        for (int i = 0; i <= r-l; ++i) {
            a[l+i] = c[i];
        }
    }
}

int main()
{
    while (scanf("%d", &N), N) {
        ans = 0;
        for (int i = 0; i < N; ++i) {
            scanf("%d", &a[i]);
        }
        merge_sort(0, N-1);
        cout << ans << endl;
    }
    return 0;    
}
posted @ 2012-07-11 01:38  沐阳  阅读(261)  评论(0编辑  收藏  举报