归并排序

#include<bits/stdc++.h>
#define il inline
#define ri register int
#define int long long
using namespace std;
const int sz=1e6;
int a[sz],c[sz],tot,n,t;
il void msort(int b,int e)
{
	if(b==e) return;
	int mid=b+e>>1,j=mid+1,i=b,k=b;
	msort(b,mid),msort(mid+1,e);
	while(i<=mid&&j<=e)
		if(a[i]<=a[j]) c[k++]=a[i++];
		else c[k++]=a[j++],tot+=mid-i+1;
	while(i<=mid) c[k++]=a[i++];
	while(j<=e) c[k++]=a[j++];
	for(ri p=b;p<=e;p++) a[p]=c[p];
}
signed main()
{
	scanf("%d",&t);
	for(ri o=1;o<=t;o++)
	{
		memset(a,0,sizeof(a));
		memset(c,0,sizeof(c));
		scanf("%lld",&n);tot=0;
		for(ri i=1;i<=n;i++) scanf("%lld",&a[i]);
		msort(1,n);
	//	for(ri i=1;i<=n;i++) cout<<a[i]<<' ';
		printf("%lld\n",tot);	
	}

	return 0;
 } 
posted @ 2022-10-15 19:04  Bertidurlah  阅读(23)  评论(1)    收藏  举报