HDU1166 - 敌兵布阵

题目大意

给定N个数,可以对这些数进行三种操作:

1、Add(i,x),对第i个数增加x

2、Sub(i,x),对第i个数减x

3、Query(x,y) ,查询区间[x,y]的和

题解

赤裸裸的树状数组啊。。。我还二逼得WA了两次,原因是读入字符串的时候用的while(cin>>s),然后就一直不能退出循环了,不知道为啥会这样。。。换成C语言风格的字符串,然后用scanf读入就没问题了。。尼玛坑爹啊。。。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#define MAXN 50005
using namespace std;
int c[MAXN];
int  n;
int lowbit(int x)
{
    return x&-x;
}
void add(int  x,int d)
{
    while(x<=n)
    {
        c[x]+=d;
        x+=lowbit(x);
    }
}
int  sum(int x)
{
    int  ret=0;
    while(x>0)
    {
        ret+=c[x];
        x-=lowbit(x);
    }
    return ret;
}
int main(void)
{
    int i,j,T,x,y,p=0;
    char s[10];
    cin>>T;
    while(T--)
    {
        printf("Case %d:\n",++p);
        scanf("%d",&n);
        memset(c,0,sizeof(c));
        for(i=1; i<=n; i++)
        {
            scanf("%d",&j);
            add(i,j);
        }
        while(scanf("%s",s)!=EOF)
        {
            if(s[0]=='E') break;
            scanf("%d%d",&x,&y);
            if(s[0]=='Q')
                printf("%d\n",sum(y)-sum(x-1));
            else if (s[0]=='A')
                add(x,y);
            else
                add(x,-y);
        }
    }
    return 0;
}

posted on 2013-04-20 00:08  仗剑奔走天涯  阅读(239)  评论(0编辑  收藏  举报

导航