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;
}

 

posted on 2011-08-22 13:28  猿类的进化史  阅读(256)  评论(0编辑  收藏  举报