Poj 1195 Mobile phones

题目大意:给定一个n*n的矩阵,要求对这个矩阵做以下四种动态操作。

  • 0 S 将S*S的矩阵元素的值都赋值为0
  • 1 X Y A 将A添加到矩阵的(X,Y)上
  • 2 L B R T 查询矩阵中的元素值(X,Y)的和,其中L<=X<=R,B<=Y<=T
  • 3 表示操作结束
思路:二维树状数组的应用。

//二维数组
#include <iostream>
using namespace std;
#include <stdio.h>
const int maxn = 1050;
int c[maxn][maxn];
int n;
int lowbit(int x) {
	return x&(-x);
}
//设原始矩阵为matrix,将matrix[x][y]加上val对c矩阵所做的修改
void add(int x, int y, int val) {
	int i=y;
	while (x<=n) {
		y=i;
		while (y<=n) {
			c[x][y]+=val;
			y+=lowbit(y);
		}
		x+=lowbit(x);
	}
}
//求matrix子矩阵的(1,1)到(x,y)的和
int get_sum(int x, int y) {
	int i=0,j=y;
	while (x>0) {
		y=j;
		while (y>0) {
			i+=c[x][y];
			y-=lowbit(y);
		}
		x-=lowbit(x);
	}
	return i;
}
int main()
{
	int instruction,i;
	int x,y,num,x1,y1;

	scanf("%d",&instruction);
	while (instruction!=3) {
		if (instruction==0) {
			scanf("%d",&n);
			for (x=1;x<=n;x++) {
				for (y=1;y<=n;y++) {
					c[x][y]=0;
				}
			}	
		}
		else if (instruction==1) {
			scanf("%d%d%d",&x,&y,&num);
			add(x+1,y+1,num);
		}
		else if (instruction==2) {
			i=0;
			scanf("%d%d%d%d",&x,&y,&x1,&y1);
			i=get_sum(x1+1,y1+1);
			i=i-get_sum(x,y1+1);
			i=i-get_sum(x1+1,y);
			i=i+get_sum(x,y);
			printf("%d\n",i);
		}

		scanf("%d",&instruction);
	}
	return 0;
}

你可能感兴趣的:(c,mobile,Matrix)