POJ_1195 Mobile phones 【二维树状数组】

题目链接:http://poj.org/problem?id=1195

纯纯的二维树状数组,不解释,只需要注意一点,由于题目中的数组从0开始计算,所以维护的时候需要加1。因为树状数组的下标是不能为1的

代码:

#include <iostream>
#include <cstdio>
#define N 1030
using namespace std;
int c[N][N];
int cas,n,x,y,a,l,b,r,t;
int Lowbit(int x)
{
    return x & (-x);
}
void Updata(int x,int y,int a)
{
    int i,k;
    for(i=x; i<=n; i+=Lowbit(i))
        for(k=y; k<=n; k+=Lowbit(k))
           c[i][k]+=a;
}
int Getsum(int x,int y)
{
    int i,k,sum = 0;
    for(i=x; i>0; i-=Lowbit(i))
        for(k=y; k>0; k-=Lowbit(k))
            sum += c[i][k];
    return sum;
}
int main()
{
    scanf("%d%d",&cas,&n);
    while(~scanf("%d",&cas))
    {
        if(cas==1)
        {
            scanf("%d%d%d",&x,&y,&a);
            Updata(x+1,y+1,a);
        }
        if(cas==2)
        {
            scanf("%d%d%d%d",&l,&b,&r,&t);
            int a=Getsum(r+1,t+1)-Getsum(l,t+1)-Getsum(r+1,b)+Getsum(l,b);
            printf("%d\n",a);
        }
        if(cas==3)
            return 0;
    }
    return 0;
}

你可能感兴趣的:(数据结构,C++,ACM,poj)