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;
}
原文地址:https://www.cnblogs.com/zjbztianya/p/3031671.html