归并排序(稳定)

逆序对
例题:洛谷 P1908 逆序对

思路:在归并排序合并时,每当从右段取数时,统计逆序对的数目。
代码:
cpp
int n;
int a[N],b[N];
int ans=0;
void msort(int l,int r){
if(l>=r) return;
int mid=(l+r)>>1;
msort(l,mid);
msort(mid+1,r);
int i=l,j=mid+1,k=l;
while(i<=mid && j<=r){
if(a[i]<=a[j]) b[k++]=a[i++];
else{
b[k++]=a[j++];
ans+=mid-i+1; //左边从i开始都大于j指的数
}
}
while(i<=mid) b[k++]=a[i++];
while(j<=r) b[k++]=a[j++];
for(i=l;i<=r;i++) a[i]=b[i];
}
void solve(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
msort(1,n);
cout<<ans<<endl;
}