AcWing 算法提高课 统计逆序对的数量

利用归并排序统计逆序对的数量

int n;
int nums[500010];
int backup[500010];
LL MergeSort(int l,int r)
{
    if(l==r) return 0;
    int mid=(l+r)/2;
    LL res=MergeSort(l,mid)+MergeSort(mid+1,r);
    int i=l,j=mid+1,k=l;
    while(i<=mid&&j<=r)
    {
        if(nums[i]<=nums[j]) backup[k++]=nums[i++];
        else 
        {
            //注意这里的统计方式,是为了在后面,
            //如果进入这里,说明j还有剩余,则i已经到了mid+1,不用改变res
            //否则,进入上面,也不用改变res
            res+=mid-i+1;
            //res+=j-mid; 这种写法统计的答案不足
            backup[k++]=nums[j++];

        }
    }
    
    while(i<=mid) backup[k++]=nums[i++];
    while(j<=r) backup[k++]=nums[j++];
    fore(id,l,r)
    {
        nums[id]=backup[id];
    }
    return res;
}
void YD()
{
    fore(i,1,n)
    {
        cin>>nums[i];
    }
    cout<<MergeSort(1,n)<<endl;
}
View Code

 

posted @ 2022-10-18 16:26  80k  阅读(27)  评论(0)    收藏  举报