树状数组入门经典题/HDU1166/HDU1754

线段树做法传送门

树状数组入门经典题/HDU1166/HDU1754_第1张图片

树状数组主要核心思想将就是,lowbit,update和getsum

lowbit(x) = x & (-x) 就是取x的二进制最右边的1和它右边所有0,也可以理解为能整除x的最大2的幂次

HDU1166:题目描述
更新单点,求区间总和

#include
#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区间最值)

你可能感兴趣的:(数据结构)