求助,有关树状数组求“逆序对”个数
  • 板块学术版
  • 楼主一只大龙猫
  • 当前回复5
  • 已保存回复5
  • 发布时间2021/9/11 17:06
  • 上次更新2023/11/4 07:04:11
查看原帖
求助,有关树状数组求“逆序对”个数
511907
一只大龙猫楼主2021/9/11 17:06

这里的逆序对定义为前面的数大于等于(不是大于)后面的数。

使用树状数组+离散化,把 sum(a[i]) 改为 sum(a[i]-1) 后,WA了。

#include<iostream>
#include<algorithm>
using namespace std;
long long n,c[100001],ans,a[100001],t[100001],m;
inline long long lowbit(long long x){
	return x&-x;
}
void add(long long i,long long x){
	while(i<=n){
		c[i]+=x;
		i+=lowbit(i);
	}
	return;
}
long long sum(long long i){
	long long s=0;
	while(i>0){
		s+=c[i];
		i-=lowbit(i);
	}	
	return s;
}
void work(){
	for(long long i=1;i<=n;i++){
		add(a[i],1);
		ans+=i-sum(a[i]-1);
	}
	cout<<ans;
	return;
}
int main(){
	cin>>n;
	for(long long i=1;i<=n;i++){
		cin>>a[i];
		t[i]=a[i];
	}
	sort(t+1,t+n+1);
	m=unique(t+1,t+n+1)-t-1;
	for(long long i=1;i<=n;i++){
		a[i]=(lower_bound(t+1,t+m+1,a[i])-t);
	}
	work();
	return 0;
}

现在求正确的解法。(最好能附上代码)

2021/9/11 17:06
加载中...