poj 1656

#include <stdio.h>
#include<string.h>
#define MAXN 200
int flag[MAXN][MAXN];
int c[MAXN][MAXN];
int lowbit(int i)
{
return i & -i;
}
void update(int x, int y, int color)
{
if (color == flag[x][y])
return ;
flag[x][y]
= color;
int i, j;
for (i = x; i <= MAXN; i += lowbit(i))
for (j = y; j <= MAXN; j+= lowbit(j))
c[i][j]
+= color;
}

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


int main()
{
int t, k, i, j, x, y, l;
char s[10];

scanf(
"%d", &t);
memset(c,
0, sizeof(c));
memset(flag,
-1, sizeof(flag));
for (k = 1; k <= t; k++)
{
scanf(
"%s%d%d%d", &s, &x, &y, &l);
if (s[0] =='B')
{
for (i = x; i <= x+l-1; i++)
for (j = y; j <= y+l-1; j++)
update(i, j,
1);
}
else if (s[0] == 'W')
{
for (i = x; i <= x+l-1; i++)
for (j = y; j <= y+l-1; j++)
update(i, j ,
-1);
}
else
printf(
"%d\n", getsum(x+l-1, y+l-1) - getsum(x+l-1,y-1) - getsum(x-1, y+l-1) + getsum(x-1, y-1));
}
return 0;
}

  引用:

这题是一个简单的二维数组操作题,简单是因为,这个和你在网上找到的介绍一维树状数组的操作差不多,只不过这个是二维的而已。

对于一个二维的树状数组,你可以这样认为:是一个一维数组,但是每个元素又是一个一维数组,也就是一维数组套一维数组。
那么更新时,可以认为是更新每个一维数组的值,但是一维数组又是一个一维数组,那么还得更改里面的一维数组的值。
那么update函数就变成了下面的代码:
对于这两个函数理解了之后,这题就是一个很简单的题了,update函数不用变,但是求和时就要改变了,不过也不能叫改变,因为,求和时会用到上面的read函数。但是所要求是一个矩形,也就是不一定是从(1,1)开始。那么我们可以变成四个矩形的和或者差,比如我们要求sum(x1,y1,x2,y2)时我们可以变成read(r,t)-read(l-1,t)-read(r,b-1)+read(l-1,b-1)。也就是大矩形减去两个小矩形然后再加一个多减去的矩形。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值