poj 2299 Ultra-QuickSort 归并排序(求逆序数模板)

来源:互联网 发布:淘宝卖家怎么看投诉 编辑:程序博客网 时间:2024/06/05 19:25
#include<cstdio>int a[600000],temp[600000],n;long long sum;//结果可能很大void mergeArray(int l,int r)//归并{    int lStart = l,lEnd = (l+r)/2,        rStart = (l+r)/2+1,rEnd = r,        i1 = 0;        while(lStart<=lEnd&&rStart<=rEnd)        {            if(a[lStart]<=a[rStart])            {                temp[i1] = a[lStart];                lStart++;                i1++;            }            else            {                sum+=(long long)(lEnd-lStart+1);//求逆序数                temp[i1] = a[rStart];                rStart++;                i1++;            }        }        for(int i=lStart;i<=lEnd;i++)        {            temp[i1] = a[i];            i1++;        }        for(int i=rStart;i<=rEnd;i++)        {            temp[i1] = a[i];            i1++;        }        for(int i=l;i<=r;i++)           a[i] = temp[i-l];}void mergeSort(int l,int r)//二分{    if(l<r)    {       mergeSort(l,(r+l)/2);       mergeSort((r+l)/2+1,r);       mergeArray(l,r);    }}int main(){    while(scanf("%d",&n)&&n)    {       sum = 0;       for(int i=0;i<n;i++)        scanf("%d",&a[i]);       mergeSort(0,n-1);       printf("%I64d\n",sum);    }    return 0;}
0 0
原创粉丝点击