欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

求逆序对的两种方法

程序员文章站 2022-05-10 19:58:26
...

归并排序

归排求逆序对用到了二分的思想
设当前归并排序讲合并的区间为[l,r][l,r]
由于归排二分,所以[l,mid][l,mid][mid+1,r][mid+1,r]两段区间都分别已经排好了序
在排序过程中,如果a[i]>a[j]a[i]>a[j],那么a[i+1]a[i+1]a[mid]a[mid]都会大于a[j]a[j]
即会产生midi+1mid-i+1个逆序对


code

O3 inline void msort(ll l,ll r)
{
	if (l==r)return;
	ll mid=(l+r)>>1,i=l,j=mid+1,k=l;
	msort(l,mid),msort(mid+1,r);
	while (i<=mid && j<=r)
	{
		if (a[i]<=a[j])b[k++]=a[i++];
		else b[k++]=a[j++],ans+=mid-i+1;
	}
	while (i<=mid)b[k++]=a[i++];
	while (j<=r)b[k++]=a[j++];
	fo(i,l,r)a[i]=b[i];
}

归排常数小,经常可以代替手打快排


树状数组

相关标签: 逆序对