填坑之归并排序
归并排序:
复杂度:稳定的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;
}