HDU 1166 敌兵布阵 树状数组解法

//http://acm.hdu.edu.cn/showproblem.php?pid=1166
//4671122 2011-09-28 13:02:52 Accepted 1166 31MS 412K 1396 B C++ nkhelloworld
//4671125 2011-09-28 13:03:32 Accepted 1166 62MS 376K 1396 B G++ nkhelloworld
//树状数组点更新求和,比线段树要快
#include <cstdio>
#include <cstring>
const int maxn = 50002;
int BITtree[maxn];
int maxval;

void BITinsert(int pos,int val)
{
    while(pos <=maxval)
    {
        BITtree[pos] += val;
        pos += (pos & -pos);
    }
}

int BITsum(int pos)
{
    int ret = 0;
    while(pos > 0)
    {
        ret += BITtree[pos];
        pos -= pos & -pos;
    }
    return ret;
}

int main()
{
    int totcase,numcase,i,j,tmp;
    scanf("%d",&totcase);
    char op[10];
    for(numcase = 1;numcase<=totcase;numcase++)
    {
        printf("Case %d:\n",numcase);
        scanf("%d",&maxval);
        memset(BITtree,0,sizeof(BITtree));
        for(i=1;i<=maxval;i++)
        {
            scanf("%d",&tmp);
            BITinsert(i,tmp);
        }
        while(scanf("%s",op))
        {
            if(op[0] == 'E')    break;
            scanf("%d%d",&i,&j);
            switch(op[0])
            {
                case 'Q':
                {
                    printf("%d\n",BITsum(j)-BITsum(i-1));
                    break;
                }
                case 'A':
                {
                    BITinsert(i,j);
                    break;
                }
                case 'S':
                {
                    BITinsert(i,-j);
                    break;
                }
            }
        }
    }
    return 0;
}

转载于:https://www.cnblogs.com/nkhelloworld/archive/2011/09/28/2194159.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值