题目大意:给出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; }