poj2299

好吧,看到这个图片就知道是干什么的了,求逆序数- -

 

 

 

可以用线段树,貌似还可以用归并排序,这题应该是考的归并排序,毕竟是递归分治- -
基本上都忘了,再写一写试试吧。
AC
/////////////////////////////////////////////////////////////////////////////////////////////

 

#include<stdio.h>

#define maxn 500005

int a[maxn], b[maxn];
long long sum=0;

void MergeSort(int a[], int N);
void Merge(int a[], int N);

int main()
{
    int i, n;

    while(scanf("%d", &n), n)
    {
        for(i=0; i<n; i++)
            scanf("%d", &a[i]);

        sum=0;
        MergeSort(a, n);

        printf("%I64d\n", sum);
    }

    return 0;
}
void MergeSort(int a[], int N)
{
    if(N > 1)
    {
        MergeSort(a, N/2);
        MergeSort(a+N/2, N-N/2);
        Merge(a, N);
    }
}
void Merge(int a[], int N)
{
    int i=0, j=N/2, k=0;
    int M=j;
    while(i < M && j<N)
    {
        if(a[i] > a[j])
        {
            b[k++] = a[j++];
            sum += M-i;
        }
        else
            b[k++] = a[i++];
    }

    while(i<M)
        b[k++] = a[i++];
    while(j<N)
        b[k++] = a[j++];

    for(i=0; i<N; i++)
        a[i] = b[i];

} 

 

posted @ 2015-04-01 15:29  无忧望月  阅读(93)  评论(0编辑  收藏  举报
levels of contents