某人的讲解
归并排序好懂
求逆序对不好懂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;
}