树状数组求逆序对

时间复杂度是O(nlog(n))
#define int long long
using namespace std;
const int N=1e5+10;
int a[N],b[N],t[N];
int n;
int lowbit(int x){
	return x&-x;
}
bool cmp(int x,int y){
	if(a[x]==a[y]){
		return x>y;
	}
	return a[x]>a[y];
}
void add(int x){
	while(x<=n){
		t[x]++;
		x+=lowbit(x);
	}
}
int sum(int x){
	int ans=0;
	while(x>=1){
		ans+=t[x];
		x-=lowbit(x);
	}
	return ans;
}
void solve(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		b[i]=i;
	}	
	sort(b+1,b+1+n,cmp);
	int ans=0;
	for(int i=1;i<=n;i++){
		add(b[i]);
		ans+=sum(b[i]-1);
	}
    cout<<ans;
}
signed main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	int t=1;
	//cin>>t;
	for(int i=1;i<=t;i++)solve();
	return 0;
} 
posted @ 2023-11-05 20:57  yufan1102  阅读(5)  评论(0编辑  收藏  举报