分析:
对于在位置i的数字
二个这个数字的最左边位置要么是它的起始位置,要么是它排序后的最终位置,所以它的最左边位置就是:min(ai,i)。
求fi用数组数组求逆序对的方法,求它左边有多少个比它小的数字然后计算出它右边比它小的数字个数即可。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
#define pr(x) cout << #x << ": " << x << " "
#define pl(x) cout << #x << ": " << x << endl;
struct jibancanyang
{
int T, n, A[112345];
int bit[112345];
int ans[112345];
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;
}
}
void fun() {
scanf("%d", &T);
for (int cas = 1; cas <= T; cas++) {
memset(bit, 0, sizeof(bit));
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%d", &A[i]);
printf("Case #%d:", cas);
for (int i = 1; i <= n; i++) {
int x = sum(A[i]);
int f = A[i] - 1 - x;
add(A[i], 1);
ans[A[i]] = i + f - min(A[i], i);
}
for (int i = 1; i <= n; i++)
printf(" %d", ans[i]);
puts("");
}
}
}ac;
int main()
{
#ifdef LOCAL
freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
#endif
ac.fun();
return 0;
}

该博客分析了如何利用树状数组来解决HDU 5774 Bubble Sort题目。内容指出,对于每个位置i上的数字ai,其能移动的最右边位置是i+fi,其中fi表示ai右侧比它小的数字个数。通过求逆序对的方法可以计算fi,并确定ai的最左边位置为min(ai, i)。"
119040195,5668011,LeetCode每日一题:找重复数,"['算法', 'LeetCode', '数据结构']
&spm=1001.2101.3001.5002&articleId=52056263&d=1&t=3&u=b1c97cefe7624edd8c7b75b9e9e216bc)
2185

被折叠的 条评论
为什么被折叠?



