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

来源:互联网 发布:java删除文件失败 编辑:程序博客网 时间:2024/03/29 13:06
Counting Black
Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 11399 Accepted: 7363

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

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

Sample Output

76
#include <stdio.h>  #include <string.h>  #include <algorithm>using namespace std;int c[102][102];int a[102][102];inline int lowbit(int x){return x & (-x);}void add(int x, int y, int v){while(x <= 100){int cur = y;while(cur <= 100){c[x][cur] += v;cur += lowbit(cur);}x += lowbit(x);}}int query(int x, int y){int ans = 0;while(x){int cur = y;while(cur){ans += c[x][cur];cur -= lowbit(cur);}x -= lowbit(x);}return ans;}int main(){memset(c, 0, sizeof(c));memset(a, 0, sizeof(a));int q, x, y, l;char s[10];scanf("%d", &q);while(q--){scanf("%s %d %d %d", s, &x, &y, &l);if(s[0] == 'W'){for(int i = x; i <= x + l - 1; ++i){for(int j = y; j <= y + l - 1; ++j){if(a[i][j] == 1){add(i, j, -1);}a[i][j] = 0;}}}else if(s[0] == 'B'){for(int i = x; i <= x + l - 1; ++i){for(int j = y; j <= y + l - 1; ++j){if(a[i][j] == 0){add(i, j, 1);}a[i][j] = 1;}}}else{printf("%d\n", query(x + l - 1, y + l - 1) - query(x + l - 1, y - 1) - query(x - 1, y + l - 1) + query(x - 1, y - 1));}}}/*题意:100*100的网格,每次操作要么将一个矩形区块变成黑色,要么是白色,或者询问区块中黑块数量。思路:询问可以二维树状数组做,修改貌似只能一个个改了。希望有大佬指点更优的办法~*/