logo AlgoBeat OnlineJudge
登录 注册

思路分析+代码

作者: Peanut933  ·  发布于 2026-07-23 14:29:46  ·  最后修改于 2026-07-23 16:54:09
已通过
审核员:AlgoBeat 官方账号 · 2026-07-23 16:54:09

首先,很容易看出的一点是 的暴力是过不了的,对吧。

我们可以通过归并排序的方式来解决这个问题。

在归并排的过程中可以一批一批的算出结果,而不是一个一个。

完整代码

#include <bits/stdc++.h>
using namespace std;
const int N=10010;
int n,a[N],tmp[N];
long long ans;
void merge_sort(int s,int e) {
	if(s==e) return;
	int mid=(s+e)/2,s1=s,s2=mid+1,t=s;
	merge_sort(s,mid);
	merge_sort(mid+1,e);
	while(s1<=mid&&s2<=e)
		if(a[s1]<=a[s2]){
			tmp[t++]=a[s1++];
		}else{
			tmp[t++]=a[s2++];
			ans+=mid-s1+1;
		}
	while(s1<=mid)
		tmp[t++]=a[s1++];
	while(s2<=e)
		tmp[t++]=a[s2++];
	for(int i=s;i<=e;i++)
		a[i]=tmp[i];
}
int main() {
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	merge_sort(1,n);
	cout<<ans;
	return 0;
}

暂无评论

登录 后即可评论。