题意:给你一个n*n的矩阵,然后对其进行操作
①一种操作:给(x,y,A)在坐标(x,y)上增加A,然后对子矩阵进行更新。
②另一种操作:查找子矩阵(x1,y1,x2,y2)对其求值。
思路:利用二维树状数组,对子矩阵进行更新和查找
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string.h>
#define maxn 1111
using namespace std;
int map[maxn][maxn];
int t,S;
int X,Y,A;
int L,B,R,T;
int lowbit(int n)
{
return (-n)&n;
}
void up_data(int x,int y,int num)
{
while(x<=S)
{
int n=y;
while(n<=S)
{
map[x][n]+=num;
n+=lowbit(n);
}
x+=lowbit(x);
}
}
int get_sum(int x,int y)
{
int ans=0;
while(x>0)
{
int n=y;
while(n>0)
{
ans+=map[x][n];
n-=lowbit(n);
}
x-=lowbit(x);
}
return ans;
}
int main()
{
int op;
while(scanf("%d%d",&t,&S)!=EOF)
{
memset(map,0,sizeof(map));
int flag=0;
while(1)
{
scanf("%d",&op);
switch(op)
{
case 1:
scanf("%d%d%d",&X,&Y,&A);
up_data(X+1,Y+1,A);
break;
case 2:
scanf("%d%d%d%d",&L,&B,&R,&T);
L++;
B++;
R++;
T++;
int ans1,ans2,ans3,ans4;
ans1=get_sum(R,T);
ans2=get_sum(L-1,B-1);
ans3=get_sum(R,B-1);
ans4=get_sum(L-1,T);
printf("%d\n",ans1+ans2-ans3-ans4);
break;
case 3:
flag=1;
break;
}
if(flag)
break;
}
}
return 0;
}