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

可以用线段树,貌似还可以用归并排序,这题应该是考的归并排序,毕竟是递归分治- -
基本上都忘了,再写一写试试吧。
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];

}

05-08 15:32