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];

} 

 

你可能感兴趣的:(poj)