逆序对的数量
归并排序的解法,今天自己拿前台样例模拟了一遍才算是入门了归并排序的感觉
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
int a[N];
int temp[N];
int k;
ll mergesort(int q[],int l,int r)
{
if(l>=r) return 0;
int mid=l+r>>1;
ll cnt=mergesort(q,l,mid)+mergesort(q,mid+1,r);
int i=l,j=mid+1;
k=0;
while(i<=mid&&j<=r)
{
if(q[i]<=q[j]) temp[k++]=q[i++];
else
{
cnt+=(mid-i+1);
temp[k++]=q[j++];
}
}
while(i<=mid) temp[k++]=q[i++];
while(j<=r) temp[k++]=q[j++];
for(i=l,j=0;i<=r;j++,i++) q[i]=temp[j];
return cnt;
}
signed main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
cout<<mergesort(a,1,n)
return 0;
}
关于这里的操作其实也算是归并算法求逆序对用时间牺牲换取的策略之一