先了解lowbit()
我对树状数组的了解还不是很深入,慢慢学习练习,再慢慢补充
树状数组经典图示
数组a是输入的数组,数组c用来辅助形成树状数组,并完成数据的修改和查询操作
c1=a1
c2=a1+a2
c3=a3
c4=a1+a2+a3+a4
c5=a5
c6=a5+a6
c7=a7
c8=a1+a2+a3+a4+a5+a6+a7+a8
查询操作:即求sum[i ,n]
①:当 sum=0,
②:if n<=0,结束,返回sum,否则sum=sum+c[n],再转到第三步
③:n=n-lowbit(n)
先附上大佬的代码做模板
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=100;
int tree[maxn];
int lowbit(int x)
{
return x&(-x);
}
//修改操作
void update(int x,int v)
{
for(int i=x;i<=maxn;i+=lowbit(i)){
tree[i]+=v;
}
}
//查询操作
int getsum(int x)
{
int res=0;
for(;x;x-=lowbit(x)){
res+=tree[x];
}
/* 或者这样写
* while(x>0){
res+=c[x];
x-=lowbit(x);}
*/
return res;
}
int main()
{
int n;
int a[maxn];
scanf("%d",&n);//区间长度
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);//输入第i个位置的数
update(i,a[i]);//从第i位进行修改树状数组
}
int q;
scanf("%d",&q);//询问次数
for(int i=1;i<=q;i++){
scanf("%d",&temp);
printf("%d\n",getsum(temp));//询问[1,temp]区间的和
}
return 0;
}