#include<stdio.h>
#define N 1000
int n;
int nums[N];
int c[N] = { 0 };
int lowbit(int i)//c[i]管理的区间长度区间长度
{
return (-i) & i;
}
void add(int i, int z)//点更新( 原数组 nums[i] 每次输入然后存放在 树状数组c[] 中都是点更新)
{
for (; i <= n; i += lowbit(i))
c[i] += z;
}
int frontsum(int i)//前缀和
{
int val = 0;
for (; i > 0; i -= lowbit(i))//累加前驱
val += c[i];
return val;
}
int qujiansum(int i, int j)// i 到 j 的区间和,即是 j 的前缀和减去 (i-1) 的前缀和
{
return frontsum(j) - frontsum(i - 1);
}
int main()
{
printf("输入数组nums元素个数:");
scanf_s("%d", &n);
printf("输入nums[i]");
for (int i = 1; i <= n; i++)
{
scanf_s("%d", &nums[i]);
add(i, nums[i]);//放入树状数组
}
int x, y;
printf("输入所求第几项前缀和:");
scanf_s("%d", &x);
printf("%d\n", frontsum(x));
printf("输入区间:");
scanf_s("%d%d", &x, &y);
printf("%d\n", qujiansum(x, y));
for (int i = 1; i <= 10; i++)//查看树状数组
printf("%d ", c[i]);
return 0;
}
更好的理解树状数组 https://b23.tv/G8qUkOW