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:
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
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的网格,每次操作要么将一个矩形区块变成黑色,要么是白色,或者询问区块中黑块数量。思路:询问可以二维树状数组做,修改貌似只能一个个改了。希望有大佬指点更优的办法~*/
阅读全文
0 0
- POJ-1656 Counting Black (二维树状数组 入门题)
- poj-1656-Counting Black-(树状数组)
- Counting Black(树状数组)
- POJ 1656 二维树状数组
- POJ 1656 Counting Black
- poj 1656 Counting Black
- POJ 1656 Counting Black
- poj 1656 Counting Black
- poj 1656 Counting Black
- poj 1656 Counting Black
- poj 1656 Counting Black
- poj 1656 Counting Black
- POJ 1656 Counting Black
- Poj 1656 Counting Black
- poj 1195 (二维树状数组入门,模板题)
- POJ-2155 Matrix (二维树状数组 入门题)
- poj 2029 二维树状数组入门
- poj 1656 Counting Black 水题
- 蓝牙:GATT,属性,特性,服务
- 大学职业生涯规划
- 文章标题
- javaWeb-编写迷你Structs2框架并使用
- 电容器的四大特性是什么
- POJ-1656 Counting Black (二维树状数组 入门题)
- Redis在windows下安装过程
- Oracle.ManagedDataAccessDTC.dll加载不正确。
- 导出pdf之--itext
- sqlserver查出来的id末位两位值出错
- C语言 累加运算
- Andriod 控件以及属性
- linux 安装MySQL
- C#调用sap rfc 接口