Mobile phones(电话簿)

poj 1195

题目大意:给出0时初始化,给出1时将矩阵中坐标为x,y的增加A,给出2时 查询区域为l<=x<=r, b<=r<=t范围内的总和

解决:二维树状数组,只要知道一维中如何插点问段,这个便顺利写出

#include <iostream>

#include <cstdio>

using namespace std;

const int N=1200;



int c[N][N];

int n;

void init()

{

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

}

int lowbit(int x)

{

    return x&(-x);

}

void updata(int x,int y,int inc)

{

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

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

       c[i][j]+=inc;

}

int query(int x,int y)

{

    int sum=0;

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

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

         sum+=c[i][j];

    return sum;

}

int main()

{

    int cmd,a,b,c,d;

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

    {

        if(cmd==0){scanf("%d",&n);init();}

        else if(cmd==1){scanf("%d%d%d",&a,&b,&c);updata(a+1,b+1,c);}

        else if(cmd==2){scanf("%d%d%d%d",&a,&b,&c,&d);printf("%d\n",query(c+1,d+1)-query(c+1,b)-query(a,d+1)+query(a,b));}

    }

    system("pause");

    return 0;

}

 

你可能感兴趣的:(mobile)