1 solutions

  • 1
    @ 2025-8-19 9:10:14
    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e5+10;
    int q[N],temp[N];
    typedef long long LL;
    LL merge_sort(int l,int r)
    {
        if(l>=r) return 0;
        int mid=l+r>>1;
        LL res=0;
        res+=merge_sort(l,mid); //左边的逆序对数目
        res+=merge_sort(mid+1,r); //右边的逆序对数目
        int i=l,j=mid+1;
        int idx=0;
        while(i<=mid&&j<=r)
        {
            if(q[i]<=q[j]) temp[idx++]=q[i++];
            else
            {
                res+=mid-i+1;//加上q[j]和左边序列构成的逆序对数目
                temp[idx++]=q[j++];
            }
        }
        while(i<=mid) temp[idx++]=q[i++]; //左边还没有放完
        while(j<=r) temp[idx++]=q[j++]; //右边还没有放完
        for(int i=l,idx=0;i<=r;i++,idx++) //按照顺序放到原位置
        {
            q[i]=temp[idx];
        }
        return res; //返回l到r这段的逆序对数目
    }
    int main()
    {
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>q[i];
        }
        cout<<merge_sort(1,n);
        return 0;
    }
    
    • 1

    Information

    ID
    328
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    5
    Tags
    # Submissions
    17
    Accepted
    6
    Uploaded By