关于归并排序做法的疑问
查看原帖
关于归并排序做法的疑问
975287
KDL_ANIPLEX楼主2024/5/27 21:22
#include<bits/stdc++.h>
using namespace std;
int n;
long long s;
int a[500010];
int d[500010];
void so(int l,int r){
	int fd=(l+r)/2;
	if (l==r)
		return;
	else{
		so(l,fd);
		so(fd+1,r);
	}
	int lt=l,rt=fd+1,dn=0;
	while (lt<=fd&&rt<=r){
		if (a[lt]>a[rt])
			s=s+fd-lt+1,d[++dn]=a[rt++];/*
            为什么是s=s+fd-lt+1,
            而s=s+rt-fd+1不行
            即:
            如果a[lt]>a[rt]
            则a[lt]与a[fd+1至rt]均为逆序对
            为什么不行
            */
		else
			d[++dn]=a[lt++];
	}
	while (lt<=fd) d[++dn]=a[lt++];
	while (rt<=r) d[++dn]=a[rt++];
	for (int i=l;i<=r;i++)
	a[i]=d[i-l+1];
	return;
}
int main(){
	cin>>n;
	for (int i=1;i<=n;i++)
	cin>>a[i];
	so(1,n);
	printf("%lld\n",s);
	return 0;
} 

2024/5/27 21:22
加载中...