求逆序对
Posted yulinss
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求逆序对相关的知识,希望对你有一定的参考价值。
逆序对
首先我们来认识一下什么叫做逆序对:如果对于 i<j,a[i]>a[j],那么a[i]和a[j]就是一对逆序对
树状数组求逆序对
我们挨个把a数组放进树状数组里,对于每一个a[i],统计a[1...i-1]中有多少个数比a[i]大,就有多少对逆序对
int n=read(); for (int i=1;i<=n;i++){ int x=read(); //读入a数组 add(x,1); //将b[x]的值加一 ans+=i-sum(x); //sum(x)求出a[1...i]中有多少个数小于等于a[i] }
printf("%d ",ans);
归并排序求逆序对
归并排序是一种基础的排序方法。
当然,在c++中允许使用STL后,归并渐渐地不常用了,毕竟任何一种排序方法都没有sort来的爽快
然而,归并还是有着自己的优势的,其中最突出的一点就是能够计算逆序对
void merge_sort(int l,int r){ if(l>=r) return; int mid=(l+r)/2; merge_sort(l,mid); merge_sort(mid+1,r); int i=l,j=mid+1,k=l; while(i<=mid||j<=r){ if((a[i]<=a[j]&&i<=mid)||j>r){ b[k++]=a[i++]; } else{ ans+=mid-i+1; b[k++]=a[j++]; } } for (int i=l;i<=r;i++) a[i]=b[i]; }
以上是关于求逆序对的主要内容,如果未能解决你的问题,请参考以下文章