填坑之归并排序
归并排序:
复杂度:稳定的O(nlogn)
空间:两倍空间
应用:求逆序对
算法思想:将数据划分为若干个有序的小区间,每次将两个区间合并时也许满足有序
逆序对 洛谷P1908
利用归并排序的思想,每次出现右端区间的数小于左区间时,统计出现的逆序对数目
#include <iostream> #include <cstdio> using namespace std; #define ll long long #define R register int n;long long ans=0; int a[500005+5],rr[500005+5]; void msort(int l,int r) { int mid=l+r>>1; if(l==r)return; msort(l,mid);msort(mid+1,r); int x=l,y=mid+1,tot=l; while(x<=mid&&y<=r) if(a[x]<=a[y])rr[tot++]=a[x++]; else rr[tot++]=a[y++],ans+=(ll)mid-x+1; while(x<=mid)rr[tot++]=a[x++]; while(y<=r)rr[tot++]=a[y++]; for(R int i=l;i<=r;i++)a[i]=rr[i]; } int main() { scanf("%d",&n); for(R int i=1;i<=n;i++)scanf("%d",&a[i]); msort(1,n); printf("%lld\n",ans); return 0; }