逆序对的数量

 

 

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

const int N = 100010;

int n;
int q[N],tep[N];

ll mergesort(int l,int r)
{
    if(l >= r)return 0;

    int mid = l + r >> 1;

    ll res = mergesort(l , mid) + mergesort(mid + 1,r);

    int k = 0;
    int i = l,j = mid + 1;
    while(i <= mid && j <= r)
    {
        if(q[i] <= q[j])tep[k ++] = q[i ++];
        else
        {
            tep[k ++] = q[j ++];
            res += mid - i + 1;
        }
    }
    while(i <= mid)tep[k ++] = q[i ++];
    while(j <= r)tep[k ++] = q[j ++];

    for(int i = l,j = 0;i <= r; i++,j++)q[i] = tep[j];
    
    return res;
}

int main()
{
    scanf("%d",&n);

    for(int i = 0; i < n; i ++)scanf("%d",&q[i]);

    cout<<mergesort(0, n -1)<<endl;
}

  

posted @ 2022-02-12 21:15  爽爽子的秃头生活  阅读(31)  评论(0)    收藏  举报