【模版】逆序对、BIT、离散化

int merge_sort(int l,int r)
{
    if(l>=r) return 0;
    int sum=0;
    int mid=(l+r)/2;
    sum+=merge_sort(mid+1,r)+merge_sort(l,mid);
    int s=l;
    int l1=l,l2=mid+1;
    while(l1<=mid || l2<=r)
    {
            if(l1<=mid&& (a[l1]<a[l2]||l2>r)) b[s++]=a[l1++];
            else if(l2<=r &&(a[l1]>a[l2]||l1>mid)) b[s++]=a[l2++],sum+=(mid-l1+1);
    }
    for(int i=l;i<=r;i++)
        a[i]=b[i];
    return sum;
}

值得注意的是之前觉得BIT求逆序对麻烦所以起手就是一个归并,实际很好写。

int lowbit(int x) {return x & -x;}
void add(int x,int k) {
	for(int i=x;i<=n;i+=lowbit(i)) c[i]+=k;
}
int query(int x) {
	int s=0;
	for(int i=x;i>0;i-=lowbit(i)) s+=c[i];
	return s;
}

真算的时候,这样就行了

for(int i=n;i>=1;i--)
{
	inv_num+=query(a[i]-1);
	add(a[i],1);
}

注意不是排列要离散化,不然存不下

int a[N],tmp[N];//tmp是a的副本
sort(tmp+1,tmp+n+1);
int len=unique(tmp+1,tmp+n+1)-(tmp+1);
for(int i=1;i<=n;i++) a[i]=lower_bound(tmp+1,tmp+n+1,a[i])-tmp;

正确的离散化。关键是要能\(O(1)\)查,是不是用容器倒无所谓。

posted @ 2025-10-03 21:53  Astral_Plane  阅读(8)  评论(0)    收藏  举报