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 @   80k  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示