逆序数模板

逆序对:a[i]>a[j]&&i<j

冒泡排序的中相邻的数进行交换顺序次数就是逆序对的个数

一:

通过归并排序

long long  cnt=0;
void merge(int l,int r)
{
    if(l>=r)return ;
    int mid=(l+r)>>1;
    merge(l,mid),merge(mid+1,r);
    int i=l,j=mid+1,k=0;
   while(i<=mid&&j<=r)
    if(a[i]<=a[j])b[k++]=a[i++];
   else b[k++]=a[j++],cnt+=mid-i+1;//当a[i]>a[j] i<j 而且i~mid j~r是两个有序的序列,则a[i~mid]都可以与a[j]构成逆序对
   while(i<=mid)b[k++]=a[i++];
   while(j<=r)b[k++]=a[j++];
   for(int i=0,j=l;j<=r;j++,i++)
    a[j]=b[i];
   return ;
}

二;

通过树状数组

猜你喜欢

转载自www.cnblogs.com/zwx7616/p/11300928.html