水水的树状数组,求冒泡排序以后所有需要冒泡的数的个数。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <vector>
#include <queue>
using namespace std;
#define maxn 1111111
#define maxm 121111
#define INF 1000000000
struct node {
int num, pos;
} a[maxn];
int n, c[maxn];
bool cmp1 (const node &a, const node &b) {
return a.num < b.num;
}
int lowbit (int x) {
return x&(-x);
}
void update (int pos) {
if (pos <= 0)
return ;
for (int i = pos; i > 0; i -= lowbit (i)) {
c[i] += 1;
}
}
int sum (int pos) {
int ans = 0;
for (int i = pos; i <= n; i += lowbit (i)) {
ans += c[i];
}
return ans;
}
int main () {
int t, kase = 0;
scanf ("%d", &t);
while (t--) {
scanf ("%d", &n);
memset (c, 0, sizeof c);
for (int i = 1; i <= n; i++) {
scanf ("%d", &a[i].num);
a[i].pos = i;
}
sort (a+1, a+1+n, cmp1);
int ans = 0;
for (int i = 1; i <= n; i++) {
if (sum (a[i].pos))
ans++;
update (a[i].pos);
}
printf ("Case #%d: %d\n", ++kase, ans);
}
return 0;
}