【模版】逆序对、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)\)查,是不是用容器倒无所谓。

浙公网安备 33010602011771号