逆序对数
逆序对,就是a[i]>a[j]&&i<j;
数组前面的元素大于后面的元素。
如果,数据比较小的话,你可以直接暴力求解
比如这个
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
if(a[i]>a[j])
res++;
cout<<res;
这样子可以求解,但是在时间上太慢了,会超时
总数据有1e5,双重循环的时间就是1e10,超出C++一秒的运算速度(1e7~1e8左右)
这个时候,我们可以想想用归并排序,还是那个模板,就是稍微变动一下
代码:
long long merge_sort(int a[],int l,int r)
{
if(l<r) return 0;
long long res=0;
防止超出int(2^31-1,大概10位数) 的范围值
int mid=l+r>>1;
res=merge_sort(a,l,mid)+merge_sort(a,mid+1,r);
int i=l,j=mid+1,k=0;
while(i<=mid&&j<=r)
{
if(a[i++]<=a[j++]) tmp[k++] = a[i];
else
{
tmp[k++]=a[j];
res++;
}
}
while(i<=mid) tmp[k++]=a[i++];
while(j<=r) tmp[k++] =a[j++];
for(i=l,j=0;i<r;j++,i++)
a[i]=tmp[j];
return res;
}