[POJ][1195][树状数组] Mobile phones

题目大意:

要求设计这样一个数据结构,支持下列操作: 1.add(x,y,a),对二维数组的第x行,第y列加上a。 2.sum(l,b,r,t),求所有满足l<=x<=r,b<=y<=t,的数组元素的和。

思路:

二维的树状数组。

代码:

#include
#include
using namespace std;
#define datasize 1024
int c[datasize+1][datasize+1],n;
int lowbit(int x)
{
    return x&-x;
}
int sum(int row,int col)
//输出满足(1<=x<=row,1<=y<=col)条件下元素的和。 
{
    int s=0;
    for(int i=row;i>0;i-=lowbit(i))
        for(int j=col;j>0;j-=lowbit(j))
            s+=c[i][j];
    return s;
}
void modify(int row,int col,int val)
//将元素(row,col)加上val。 
{
    for(int i=row;i<=n;i+=lowbit(i))
        for(int j=col;j<=n;j+=lowbit(j))
            c[i][j]+=val;
}
int main()
{
    int op;
    while(scanf("%d",&op)&&op<3)
        if(op==0)
        {
            scanf("%d",&n);
            memset(c,0,sizeof(c));
        }
        else if(op==1)
        {
            int x,y,a;
            scanf("%d%d%d",&x,&y,&a);
            modify(x+1,y+1,a);
        }
        else
        {
            int l,b,r,t;
            scanf("%d%d%d%d",&l,&b,&r,&t);
            printf("%d\n",sum(r+1,t+1)-sum(l,t+1)-sum(r+1,b)+sum(l,b));
        }
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注