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;

}

你可能感兴趣的:(mobile)