Counting Black
Time Limit: 1000MS | Memory Limit: 10000K | |
Total 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:
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.
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
#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的网格,每次操作要么将一个矩形区块变成黑色,要么是白色,或者询问区块中黑块数量。 思路:询问可以二维树状数组做,修改貌似只能一个个改了。 希望有大佬指点更优的办法~ */