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;

}

你可能感兴趣的:(HDU)