您的位置:首页 > 其它

POJ-1656 Counting Black (二维树状数组)

2013-05-21 22:54 393 查看
Counting Black

Time Limit: 1000MSMemory Limit: 10000K
Total Submissions: 9655Accepted: 6225
Description

There is a board with 100 * 100 grids as shown below. The left-top gird is denoted as (1, 1) and the right-bottom grid is (100, 100).



We may apply three commands to
the board:

1.	WHITE  x, y, L     // Paint a white square on the board,

// the square is defined by left-top grid (x, y)

// and right-bottom grid (x+L-1, y+L-1)

2.	BLACK  x, y, L     // Paint a black square on the board,

// the square is defined by left-top grid (x, y)

// and right-bottom grid (x+L-1, y+L-1)

3.	TEST     x, y, L    // Ask for the number of black grids

// in the square (x, y)- (x+L-1, y+L-1)


In
the beginning, all the grids on the board are white. We apply a series of
commands to the board. Your task is to write a program to give the numbers of
black grids within a required region when a TEST command is applied.
Input

The first line of the input is an integer t (1 <= t
<= 100), representing the number of commands. In each of the following lines,
there is a command. Assume all the commands are legal which means that they
won't try to paint/test the grids outside the board.
Output

For each TEST command, print a line with the number of
black grids in the required region.
Sample Input

5
BLACK 1 1 2
BLACK 2 2 2
TEST 1 1 3
WHITE 2 1 1
TEST 1 1 3

Sample Output

7
6

Source

POJ Monthly--2004.05.15 Liu Rujia@POJ

#include <cstdio>
#include <cstring>
#include <iostream>

using namespace std;

int a[105][105];
int col[105][105];

int lowbit(int i)
{
return i & (-i);
}

void add(int x, int y, int color)
{
if(col[x][y] == color)
return;
col[x][y] = color;
for(int i = x; i < 105; i += lowbit(i))
for(int j = y; j < 105; j += lowbit(j))
a[i][j] += color;
}

int getSum(int x, int y)
{
int ans = 0;
for(int i = x; i > 0; i -= lowbit(i))
for(int j = y; j > 0; j -= lowbit(j))
ans += a[i][j];
return ans;
}

int main()
{
int T, x, y, len;
char cmd[10];
scanf("%d", &T);
memset(a, 0, sizeof(a));
memset(col, -1, sizeof(col));
while(T--)
{
scanf("%s%d%d%d", cmd, &x, &y, &len);
if(cmd[0] == 'B')
{
for(int i = x; i < x+len; ++i)
for(int j = y; j < y+len; ++j)
add(i, j, 1);
}
else if(cmd[0] == 'W')
{
for(int i = x; i < x+len; ++i)
for(int j = y; j < y+len; ++j)
add(i, j, -1);
}
else
{
printf("%d\n", getSum(x+len-1,y+len-1) + getSum(x-1,y-1) - getSum(x-1,y+len-1) - getSum(x+len-1,y-1));
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: