/*树状数组案例:
给出数组a[1], a[2], ... , a[n]
输出数组ans[1], ans[2], ... , ans[n] 满足
ans[i](0 < i <= n)的值是集合{a[j] | 0 < j < i 且 a[j] < a[i])}
所包含的元素的个数*/
#include <stdio.h>
#define N 1000
int a[N+10], n;
int ans[N+10], tree[N+10];
void update(int x, int value);
int getsum(int x);
int main()
{
int i, j;
scanf("%d", &n);
for (i = 1; i <= n; i++)
scanf("%d", &a[i]);
/*核心部分*/
for (i = 1; i <= n; i++) {
/*如果是统计位置i右边小于a[i]的个数
循环改写为for (i = n; i >= 1; i--)即可*/
ans[i] = getsum(a[i]);
update(a[i], 1);
}
for (i = 1; i <= n; i++)
printf("%d ", ans[i]);
printf("\n");
return 0;
}
void update(int x, int value)
{
while (x <= N) {
tree[x] += value;
x += x & (-x);
}
return
树状数组初学(1)——位置i左(右)边小于a[i]的个数
最新推荐文章于 2023-05-23 13:37:15 发布
这篇博客介绍了树状数组的基本功能,通过一个案例展示了如何利用树状数组统计数组中元素出现的次数,并高效地求解数组中每个位置左侧小于等于该位置值的元素个数。树状数组可以替代传统的桶(值空间)数据结构,简化代码并提高效率。
摘要由CSDN通过智能技术生成