题目大意:给出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;
}
浙公网安备 33010602011771号