题意:给你一个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; }