树状数组 ( 基础篇 )——敌兵布阵 ( HDU 1166 )

  • 题目链接:
    http://acm.hdu.edu.cn/showproblem.php?pid=1166

  • 分析:
    输入一堆数,范围小于50000,要求对其进行修改具体元素,区间求和两种操作。一看就是树状数组。

  • 题解:

先来一发树状数组的基本模板:

int TreeArray[40005],N;

int lowbit(int i)//lowB操作!!!
{
    return i & (-i);//求出2^p次,p为i的二进制数中,从右往左数第一个1的位置(从0开始数)
}
void Add(int loc, int value)//将loc位置的元素+=value
{
    while(locvalue;
        loc += lowbit(loc);
    }
}
int Sum(int loc)//求前loc项的元素和
{
    int ans = 0;
    while(loc>0)
    {
        ans += TreeArray[loc];
        loc -= lowbit[loc];
    }
    return ans;
}

然后这题就做完了QAQ

  • AC代码:
#include 
#include 
#include 
#include 
#define LEN 50004
using namespace std;

int lowbit(int k)
{
    return k&(-k);

}
int e[LEN];

void add(int k, int v)  //第K个元素加上v
{
    while(kint sum(int k)  //求前k项的和
{
    int re=0;
    while(k>0)
    {
        re += e[k];
        k -= lowbit(k);
    }
    return re;
}

char op[5];
int n;

int main()
{
    int T,tt=1;
    int i,j;
    scanf("%d", &T);
    while(T--)
    {
        scanf("%d", &n);
        memset(e, 0, sizeof(e));
        for( i=1; i<=n; i++)
        {
            scanf("%d", &j);
            add(i, j);
        }
        printf("Case %d:\n", tt++);
        while( scanf("%s", op) && op[0] != 'E')
        {

            scanf("%d%d", &i, &j);
            if(op[0] == 'Q')
            {
                printf("%d\n", sum(j) - sum(i-1));
            }else if(op[0] == 'A')
            {
                add(i, j);
            }
            else
                add(i, -j);
        }
    }
}

你可能感兴趣的:(ACM算法(题解):,数据结构,——树状数组)