hdu 2642stars(二维树状数组)

                       基础题……写完代码,却发现样例都过不了,找了N久的错, 也没发现哪出问题了, 再仔细一看题,发现查询时是先输入两个横坐标,再输入两个纵坐标,而不是先输入一个点的坐标,再输入一个点的坐标……无语……

#include<stdio.h>
#include<string.h>
#define MAX 1001
int c[1003][1003], bright[1003][1003];
int max(int a, int b)
{
	return a>b?a:b;
}
int min(int a, int b)
{
	return a<b?a:b;
}

void update(int x, int y, int data) 
{
	for(int i=x ; i<=MAX; i+=i&(-i))
		for(int j=y ; j<=MAX; j+=j&(-j))
			c[i][j]+=data;	
}

int query(int x,int y)
{
	int sum=0;
	for(int i=x ; i>0; i-=i&(-i))
		for(int j=y ; j>0; j-=j&(-j))
			sum+=c[i][j];
	return sum;
}
int main()
{
	int m, ans, x, y, x1, y1, x2, y2;
	int xmax, ymax, xmin, ymin;
	char s;
	scanf("%d", &m);
	memset(c,0,sizeof(c));
	memset(bright,0,sizeof(bright));
	while(  m-- )
	{
		getchar();
		scanf("%c",&s);
		if( s=='B')
		{
			scanf("%d %d",&x, &y);
			if( !bright[++x][++y])//如果是暗的,就改为亮的 
			{
				update(x, y, 1);
				bright[x][y]=1;
			}
		}
		else if(s=='D')
		{
		    scanf("%d %d",&x, &y);
			if( bright[++x][++y])//如果是暗的,就改为亮的 
			{
				update(x, y, -1); 
				bright[x][y]=0;
			}
		}
		else
		{
			scanf("%d %d %d %d",&x1, &x2, &y1, &y2); 
			x1++; y1++; x2++; y2++;
			xmax=max(x1,x2);ymax=max(y1,y2);xmin=min(x1,x2);ymin=min(y1,y2);
			ans=query(xmax,ymax)+query(xmin-1,ymin-1)-query(xmax,ymin-1)-query(xmin-1,ymax);
			printf("%d\n", ans);
		}

	}
}


你可能感兴趣的:(hdu 2642stars(二维树状数组))