Bubble Sort
.
.
对于一个数它后退的最后位置为它初始位置加上排在它后面的比它小的数字的个数,这里可以用树状数组来维护。然后它往前的位置为它本身的值,都记录一下就好了。
.
.
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
const int maxn = 150000;
int f[maxn], a[maxn], l[maxn], r[maxn], n;
int find(int x) {
int count = 0;
while (1) {
if (x <= 0) break;
count += f[x];
x = x-(x&(-x));
}
return count;
}
void insert(int x) {
while (1) {
if (x > n) break;
f[x]++;
x = x+(x&(-x));
}
}
int main() {
int tt;
scanf("%d", &tt);
for (int cases = 1; cases <= tt; cases++) {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
l[a[i]] = i;
r[a[i]] = i;
}
memset(f, 0, sizeof(f));
for (int i = n; i >= 1; i--) {
int t = find(a[i]);
insert(a[i]);
r[a[i]] = r[a[i]]+t;
}
for (int i = 1; i <= n; i++) {
if (a[i] < l[a[i]]) l[a[i]] = a[i];
if (a[i] > r[a[i]]) r[a[i]] = a[i];
}
printf("Case #%d:", cases);
for (int i = 1; i <= n; i++) printf(" %d", r[i]-l[i]);
printf("\n");
}
}