树状数组主要核心思想将就是,lowbit,update和getsum
lowbit(x) = x & (-x) 就是取x的二进制最右边的1和它右边所有0,也可以理解为能整除x的最大2的幂次
HDU1166:题目描述
更新单点,求区间总和
#include<cstdio>
#define lowbit(i) ((i)&(-i))
const int MAXN=50005;
int c[MAXN];
int T,n;
void update(int x,int v){
for(int i=x;i<MAXN;i+=lowbit(i))
c[i]+=v;
}
int getSum (int x){
int sum=0;
for(int i=x;i>0;i-=lowbit(i))
sum+=c[i];
return sum;
}
int main()
{
freopen("hdu1166.txt","r",stdin);
scanf("%d",&T);
while(T)
{
printf("Case %d:\n",T--);
scanf("%d",&n);
int u,v;
for(int i=1;i<=n;i++){
scanf("%d",&u);
update(i,u);
}
char q[6];
while(1){
scanf("%s%d%d",q,&u,&v);
if(q[0]=='E') break;
else if(q[0]=='A') update(u,v);
else if(q[0]=='S') update(u,-v);
else printf("%d\n",getSum(v)-getSum(u-1));
}
}
return 0;
}
HDU1754参考代码传送门
这道题还是线段树做更加简单(RMQ区间最值)