POJ1195 - Mobile phones

题目大意

给定一个N*N的网格,刚开始每个网格的值都是0,接下来会对这些网格进行操作,有一下两种操作:

1、”X Y A“对网格C[x][y]增加A

2、”L B R T“ 查询所有(L<=X<=R,B<=Y<=T)的网格C[X[Y],并返回它们的总和

题解

非常经典的二维树状数组题目,直接看代码吧

代码

#include<iostream>

#include<cstdio>

#include<cstring>

#include<string>

#define MAXN 1050

using namespace std;

int c[MAXN][MAXN];

int n;

int lowbit(int x)

{

    return x&-x;

}

int sum(int x,int y)

{

    int i,j,ret=0;

   for(i=x;i>0;i-=lowbit(i))

   for(j=y;j>0;j-=lowbit(j))

   ret+=c[i][j];

   return ret;

}

void add(int x,int y,int d)

{

    int i,j;

        for(i=x;i<=n;i+=lowbit(i))

        for(j=y;j<=n;j+=lowbit(j))

        c[i][j]+=d;

}

int main(void)

{

    int a,j,lb,x1,y1,x2,y2,ans;

    while(cin>>a>>n)

    {

        memset(c,0,sizeof(c));

        while(scanf("%d",&lb)==1&&lb!=3)

        {

            if(lb==2)

            {

                  ans=0;

                  scanf("%d%d%d%d",&x1,&y1,&x2,&y2);

                  x1++; y1++;

                  x2++; y2++;

                ans+=sum(x2,y2);

                ans-=sum(x1-1,y2);

                ans-=sum(x2,y1-1);

                ans+=sum(x1-1,y1-1);

                printf("%d\n",ans);

            }

            else

            {

                scanf("%d%d%d",&x1,&y1,&j);

                x1++;

                y1++;

                add(x1,y1,j);

            }

        }

    }

    return 0;

}

你可能感兴趣的:(mobile)