POJ 1195 mobile phones 二维树状数组

题意很简单,就是求一定范围内子矩阵的和,数据量很大,用暴力的话一定会超时,这道题用二维的树状数组做比较简单。。。

#include<stdio.h>
#include<string.h>
#include <iostream>
using namespace std;
#define MAX 1030
int tree[MAX][MAX];
int S,ans;
int lowbit(int x){return x&(-x);}
void add(int x,int y,int num)
{
	for(int i=x;i<=S;i+=lowbit(i))
	{
		for(int j=y;j<=S;j+=lowbit(j))
		{
			tree[i][j]+=num;
		}
	}
}
int query(int x,int y)
{
	int 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()
{
	setbuf(stdout,NULL);
	int instruction;
	scanf("%d %d",&instruction,&S);
	memset(tree,0,sizeof(tree));

	while(scanf("%d",&instruction)!=EOF)
	{
		if(instruction==3)break;
		if(instruction==1)
		{
			int X,Y,A;
			scanf("%d %d %d",&X,&Y,&A);
			add(X+1,Y+1,A);
		}
		else
		{
			int L,B,R,T;
			scanf("%d %d %d %d",&L,&B,&R,&T);
			ans=query(R+1,T+1)+query(L,B)-query(L,T+1)-query(R+1,B);
			printf("%d\n",ans);
		}
	}
	return 0;
}

posted on 2011-07-23 13:09  lonelycatcher  阅读(199)  评论(0编辑  收藏  举报

导航