POJ1195 Mobile phones【树状数组】【二维】

题目链接:

?id=1195

题目大意:

给出一个N*N的矩阵,初始化都为0,坐标从(0,0)开始。有三个操作:

命令1:1 x y w;将坐标为(x,,y)处的点值增加w

命令2:2 x1 y1 x2 y2;询问左下角坐标为(x1,y1)、右上角坐标为(x2,y2)的矩阵和是多少

命令3:3;不需要操作,退出。

思路:

二位树状数组单点更新,区间求值的简单题。直接做就可以了。最后求矩阵和的时候考虑容斥定理。

即ans =Query(x1-1,y1-1)-Query(x1-1,y2)-Query(x2,y1-1)+Query(x2,y2)。

AC代码:

#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#define LL __int64using namespace std;const int MAXN = 1100;int Tree[MAXN][MAXN],N = 1025;int Lowbit(int x){return x & (-x);}void Update(int x,int y,int w){for(int i = x; i <= N; i += Lowbit(i))for(int j = y; j <= N; j += Lowbit(j))Tree[i][j] += w;}LL Query(int x,int y){LL sum = 0;for(int i = x; i > 0; i -= Lowbit(i))for(int j = y; j > 0; j -= Lowbit(j))sum += Tree[i][j];return sum;}int main(){int op,n;while(~scanf("%d%d",&op, &n)){memset(Tree,0,sizeof(Tree));while(~scanf("%d",&op) && op != 3){if(op == 1){int x,y,w;scanf("%d%d%d",&x,&y,&w);Update(x+1,y+1,w);}else if(op == 2){int x1,y1,x2,y2;scanf("%d%d%d%d",&x1,&y1,&x2,&y2);x1++,y1++,x2++,y2++;printf("%I64d\n",Query(x1-1,y1-1)-Query(x1-1,y2)-Query(x2,y1-1)+Query(x2,y2));}}}return 0;}

使用双手的是劳工,使用双手和头脑的舵手,

POJ1195 Mobile phones【树状数组】【二维】

相关文章:

你感兴趣的文章:

标签云: