poj 1195

题意:一个n*n的矩阵,和几种动态操作,包括对某一点(x,y)值修改,查询子矩阵(x,y,xx,yy)的元素和。

 

思路:二维树状数组,典型的动态操作题目。查询子矩阵(x,y,xx,yy)的元素和,注意一下就可以了:

 

sum(xx, yy)-sum(x-1, yy)-sum(xx, y-1)+sum(x-1,y-1);

代码:

#include<iostream>
#include<fstream>

using namespace std;

int b[1025][1025];

int lowbit(int x){
	return x&(-x);
}
int n;

void add(int x,int y,int s){
	int i=y;
	while(x<=n)
	{
		y=i;
		while(y<=n)
		{
			b[x][y]+=s;
			y+=lowbit(y);
		}
		x+=lowbit(x);
	}
}

int getsum(int x,int y){
	int i=0,j=y;
	while(x>0)
	{
		y=j;
		while(y>0)
		{
			i+=b[x][y];
			y-=lowbit(y);
		}
		x-=lowbit(x);
	}
	return i;
}

void read(){
//	ifstream cin("in.txt");
	int i,j,k,s,t,p;
	cin>>i;
	while(1){
		if(i==3) return;
		if(i==0)
		{
			cin>>n;
			memset(b,0,sizeof(b));
		}
		else
			if(i==1)
			{
				cin>>j>>k>>s;
				j++;k++;
				add(j,k,s);
			}
			else
				if(i==2)
				{
					cin>>j>>k>>s>>t;
					j++;k++;s++;t++;
					p=getsum(s,t);
					p+=getsum(j-1,k-1);
					p-=getsum(s,k-1);
					p-=getsum(j-1,t);
					cout<<p<<endl;
				}
		cin>>i;
	}

}

int main(){
	read();
	return 0;
}

posted on 2011-05-14 16:21  宇宙吾心  阅读(382)  评论(0)    收藏  举报

导航