归并排序
1.数组从0开始用
2.二分为(l+1<r)
3.cnt+=mid+j-k-1;
4.递归meger(0,n,a)
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll nil=20000000000;
const int maxn=500000+10;
ll L[maxn/2],R[maxn/2];
int n;
ll a[maxn];
ll megersort(int l,int r,int mid,ll a[]){
int n1=mid-l;
int n2=r-mid;
ll cnt=0;
int i,j;
for (i=0;i<n1;i++) L[i]=a[l+i];
for (j=0;j<n2;j++) R[j]=a[mid+j];
L[n1]=nil;
R[n2]=nil;
i=j=0;
for (int k=l;k<r;k++){
if(L[i]<=R[j]){
a[k]=L[i++];
}
else {
a[k]=R[j++];
cnt+=mid+j-k-1;
}
}
return cnt;
}
ll meger(int l,int r,ll a[]){
if(l+1<r){
int mid=(l+r)>>1;
ll v1=meger(l,mid,a);
ll v2=meger(mid,r,a);
ll v3=megersort(l,r,mid,a);
return v1+v2+v3;
}
else return 0;
}
int main(){
// freopen("coo.out","w",stdout);
while(scanf("%d",&n)&&n!=0){
memset(a,0,sizeof(a));
for (int i=0;i<n;i++) scanf("%d",&a[i]);
printf("%lld\n",meger(0,n,a));
}
return 0;
}
来源:https://www.cnblogs.com/lmjer/p/8885576.html