http://poj.org/problem?id=2299

题意 : 排序,求排序次数,本来以为用冒泡可以搞定,事实上,那么大的数据以及一个TLE告诉我,会超时.........

思路 : 问了一下,这个题就是归并排序求逆序数,可以百度一下,看了白皮书

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std ;
int A[500400],T[500400];
long long cnt ;
void merge_sort(int* A,int x,int y,int* T)
{
    if(y-x>1)
    {
        int m = x+(y-x)/2 ;
        int p = x,q = m ,i = x ;
        merge_sort(A,x,m,T);
        merge_sort(A,m,y,T);
        while(p < m || q < y)
        {
            if(q >= y || (p < m && A[p] <= A[q]))
            T[i++] = A[p++];
            else
            {
            T[i++] = A[q++] ;
            cnt += m-p ;
            }
        }
        for(i = x ; i < y ; i++)
        A[i] = T[i] ;
    }
}
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        if(n == 0)
        break ;
        cnt = 0 ;
        for(int i = 1 ; i <= n ; i++)
        {
            scanf("%d",&A[i]) ;
        }
        merge_sort(A,1,n+1,T);
        printf("%lld\n",cnt) ;
    }
    return 0 ;
}
View Code

 

posted on 2013-08-19 21:03  枫、  阅读(177)  评论(0编辑  收藏  举报