30分求助,采用的分治算法
  • 板块P1908 逆序对
  • 楼主an_yu
  • 当前回复6
  • 已保存回复6
  • 发布时间2022/9/29 21:58
  • 上次更新2023/10/27 09:30:23
查看原帖
30分求助,采用的分治算法
758984
an_yu楼主2022/9/29 21:58
#include <iostream>
using namespace std;
long long ans=0;
void merge(long long a[],int s,int m,int e){
	if(s>=e){
		return;	
	}
	int p1=s,p2=m+1,p=0,i;
	int tmp[e-s+1];
	while(p1<=m&&p2<=e){
		if(a[p1]>a[p2]){
			tmp[p++]=a[p1++];
		}else{
			tmp[p++]=a[p2++];
		}
	}
	while(p1<=m){
		tmp[p++]=a[p1++];
	}
	while(p2<=e){
		tmp[p++]=a[p2++];
	}//然后重新把tmp里的值赋给a,这就实现了从大到小的归并排序
	for(i=0;i<e-s+1;i++){
		a[s+i]=tmp[i];
	}
}
void mergesort(long long a[],int s,int e){
	if(s>=e){
		return;
	}else{
		int m=s+(e-s)/2;
		int i=s,j=m+1;
		mergesort(a,s,m);
		mergesort(a,m+1,e);
		while(i<=m&&j<=e){
			if(a[i]<a[j]){
				j++;
			}else{
				ans+=e-j+1;
				i++;
			}
		}
		merge(a,s,m,e);
		
	}
}
int main(){
	int n,i;
	scanf("%d",&n);
	long long a[n];
	for(i=0;i<n;i++){
		scanf("%lld",&a[i]);
	}
	mergesort(a,0,n-1);
	printf("%lld",ans);
	return 0;
}

代码如上,在第六个样例中标准答案为402002139 而我的输出为402002142 不知道问题出在哪里了。


另外为什么在归并的过程中,函数开头的边界条件如果设置成s>e就会出错,必须写成s>=e呢?


感谢大佬们肯抽出时间指点!

2022/9/29 21:58
加载中...