逆序数模板
逆序对: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 ; }
二;
通过树状数组