(BITで)AOJ 0167 - Bubble Sort(回数を調べる)

小さい順に1,2,3,...,nとつけて,BITをつかえばいいとかとか.

#include<iostream>
#include<algorithm>
#include<map>

const int MAX_N = 100;
int bit[MAX_N+1], n;

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;
	}
}

int main(){
	int a[MAX_N], b[MAX_N];
	while(std::cin >> n, n){
		for(int i=0;i<MAX_N+1;i++){
			bit[i] = 0;
		}

		for(int i=0;i<n;i++){
			std::cin >> a[i];
		}

		for(int i=0;i<n;i++){
			b[i] = a[i];
		}
		std::sort(b, b+n);
		std::map<int, int> m;
		for(int i=0;i<n;i++){
			m[b[i]] = i+1;
		}

		int t = 0;
		for(int i=0;i<n;i++){
			t += i - sum(m[a[i]]);
			add(m[a[i]], 1);
		}

		std::cout << t << std::endl;
	}
}