逆序对

归并排序求逆序对

const int N=1e5+10;
int a[N],b[N];
int n;
LL ans;

void merge(int l,int r)
{
    if(l>=r) return;
    int mid=l+r>>1;
    merge(l,mid);
    merge(mid+1,r);

    int i=l,j=mid+1;
    for(int k=l;k<=r;k++)
        if(j>r || (i<=mid && a[i]<=a[j])) b[k]=a[i++];
        else
        {
            b[k]=a[j++];
            ans+=mid-i+1;
        }
        
    for(int k=l;k<=r;k++) a[k]=b[k];
}

int main()
{
    cin>>n;

    for(int i=0;i<n;i++) cin>>a[i];

    merge(0,n-1);
    
    cout<<ans<<endl;

    //system("pause");
}
posted @ 2020-08-25 18:46  Dazzling!  阅读(151)  评论(0编辑  收藏  举报