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

线段树做法传送门

在这里插入图片描述

树状数组主要核心思想将就是,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区间最值)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值