求给定数组的冒泡排序的交换次数,即求逆序数的个数 (i<j, a[i]>a[j])
使用BIT实现,每当求sum(a[j])的时候,求得的是顺序数的个数,j为位置,所以j-sum(a[j])的值就是逆序数的个数。
然后讲a[j]的位置+1,整个数组循环过后便可求得逆序数的个数。
重点注意BIT的维护方法,参见《挑战程序竞赛》第二版177-178页。
//
// 178_bubble sort number.cpp
// changlle
//
// Created by user on 1/19/16.
// Copyright (c) 2016 user. All rights reserved.
//
#include <iostream>
using namespace std;
typedef long long ll;
const int MAX_N=1000;
int n=4;
int a[4]={3,1,4,2};
//BIT
int bit[MAX_N+1];
int sum(int i) {
int s=0;
while (i>0) {
s+=bit[i];
i-= i & -i;
}
return s;
}
void add (int i,int x) {
while(i<=n) {
bit[i]+=x;
i+= i & -i;
}
}
//BIT
void solve () {
ll ans=0;
for (int j=0;j<n;j++) {
ans+=j-sum(a[j]);
add(a[j],1);
}
cout<<ans<<endl;
}
int main() {
solve();
return 0;
}