poj 2299 Ultra-QuickSort

来源:互联网 发布:cba数据库 编辑:程序博客网 时间:2024/06/15 14:50

求逆序数对

#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int MAX = 5e5 + 5;int arr[MAX], tmp[MAX];__int64 res;void merge_sort(int* arr, int* tmp, int l, int r){    if (l == r)        return ;    int m = (l + r) >> 1;    merge_sort(arr, tmp, l, m);    merge_sort(arr, tmp, m + 1, r);    for (int i = l; i <= r; ++i)        tmp[i] = arr[i];    int i1 = l, i2 = m + 1;    for (int curr = l; curr <= r; ++curr)    {        if (i1 == m + 1)            arr[curr] = tmp[i2++];        else if (i2 > r)            arr[curr] = tmp[i1++];        else if (tmp[i1] <= tmp[i2])            arr[curr] = tmp[i1++];        else        {            res += (m - i1 + 1);            arr[curr] = tmp[i2++];        }    }}int main(){    int n;    while (scanf("%d", &n))    {        res = 0;        if (n == 0)            break;        for (int i = 0; i != n; ++i)            scanf("%d", &arr[i]);        merge_sort(arr, tmp, 0, n - 1);        printf("%I64d\n", res);    }    return 0;}


0 0