归并排序求逆序对

来源:互联网 发布:利率敏感性缺口 数据 编辑:程序博客网 时间:2024/06/06 19:55

某人的讲解
归并排序好懂
求逆序对不好懂qwq
将2段序列合并时,如果后面序列的一个数比前面序列的一个数x小,他必然比第一个序列x后的所有数小,tot+=mid-i+1
(很简单是不是)
裸题

#include<iostream>#include<cstdio>using namespace std;int a[1000001],n,q[10000001],l,r,mid,m,i,j,k,tot;int sum(int l,int r){    m=(l+r)/2;    i=l;j=m+1;k=1;    while(i<=m&&j<=r)    {        if(a[i]<a[j])        q[k++]=a[i++];        else        {            q[k++]=a[j++];            tot+=m-i+1;//精髓        }    }    while(i<=m)    {        q[k++]=a[i++];    }    while(j<=r)    {        q[k++]=a[j++];    }    for(int j=l;j<=r;j++)    {        a[j]=q[j-l+1];    }}int pai(int l,int r){    mid=(l+r)/2;    if(l<r)    {        pai(l,mid);        pai(mid+1,r);//好好理解吧,类似线段树        sum(l,r);    }}int main(){    cin>>n;    for(int i=1;i<=n;i++)    {        scanf("%d",&a[i]);    }    pai(1,n);    cout<<tot;}