关于本题的ans计数的疑惑?
查看原帖
关于本题的ans计数的疑惑?
223495
vegetablebird4396楼主2020/5/29 11:17
#include <bits/stdc++.h>
using namespace std;
/*     本次的代码中,数组要从1开始计数,不从0开始        */
long long int a[500050],tool[500050],ans=0;

int main()
{
	void mer_sort(long long int a[],long long int lef,long long int mid,long long int rig);
	void merge_tool(long long int a[],long long int lef,long long int rig);
	long long int n;	scanf("%lld", &n);
	for(long long int i=1;i<=n;i++) scanf("%lld", &a[i]);
	merge_tool(a,1,n);
	printf("%lld",ans);
	system("pause");
}

void mer_sort(long long int a[],long long int lef,long long int mid,long long int rig)
{
	long long int i=lef,j=mid+1,k=lef;//lef , mid & rig need attention!!!
	while(i<=mid&&j<=rig)
	{
		if(a[i]<=a[j]) tool[k++]=a[i++];
		else
		{			
			tool[k++]=a[j++];			
			ans+=mid-i+1;
		}		
	}
	if(i>mid)
		for(long long int t=j;t<=rig;t++)	tool[k++]=a[t];
	if(j>rig)
		for(long long int t=i;t<=mid;t++)	tool[k++]=a[t];
	for(long long int t=lef;t<=rig;t++) a[t]=tool[t];
}

void merge_tool(long long int a[],long long int lef,long long int rig)
{
	if(lef>=rig) return;
	else
	{
		merge_tool(a,lef,(lef+rig)/2);
		merge_tool(a,(rig+lef)/2+1,rig);
		mer_sort(a,lef,(rig+lef)/2,rig);
	}
}

就是在mer_sort()函数中的27行
ans的计数代码那里
为何要使用ans+=mid-i+1;
鄙人用ans+=j-i; 就全WA了 /雾

2020/5/29 11:17
加载中...