pku_2155_Matrix
2013-05-18 19:39
204 查看
楼教主出的题呀,二维树状数组入门经典.
题目大意:
给一个二维数组,初始都是0,有两个操作:
C x1,y1 x2,y2: 从坐标1到坐标2所有数异或1.
Q x,y : 询问坐标x,y的真假值.
解题思想:
题意可以转化为,求一个二维矩阵点从0,0到x,y的总和的奇偶性.更新的方法为 0,0到x2,y2 - 0,0到x1,y2 - 0,0到x2,y1 + 0,0到x1,y1,这个不难理解吧.
源代码:
题目大意:
给一个二维数组,初始都是0,有两个操作:
C x1,y1 x2,y2: 从坐标1到坐标2所有数异或1.
Q x,y : 询问坐标x,y的真假值.
解题思想:
题意可以转化为,求一个二维矩阵点从0,0到x,y的总和的奇偶性.更新的方法为 0,0到x2,y2 - 0,0到x1,y2 - 0,0到x2,y1 + 0,0到x1,y1,这个不难理解吧.
源代码:
#include <myhead> const int maxn=1001; int c[maxn][maxn]; int n; int lowbit(int x) { return x & (-x); } void add(int x, int y) { while(x <= n) { int ty = y; while(ty <= n) { c[x][ty] ^= 1; ty += lowbit(ty); } x += lowbit(x); } } int sum(int x, int y) { int s = 0; if(x > n) x = n; if(y > n) y = n; while(x >= 1) { int ty = y; while(ty >= 1) { s ^= c[x][ty]; ty -= lowbit(ty); } x -= lowbit(x); } return s; } int main() { int t, m; int i, j; scanf("%d", &t); while(t--) { scanf("%d %d", &n, &m); memset(c, 0, sizeof(c)); while(m--) { char str[5]; int x1, y1, x2, y2; scanf("%s", str); if(str[0] == 'C') { scanf("%d %d %d %d", &x1, &y1, &x2, &y2); add(x1, y1); add(x2+1, y2+1); add(x1, y2+1); add(x2+1, y1); }else { scanf("%d %d", &x1, &y1); printf( "%d\n", sum(x1, y1) ); } } if(t) puts(""); } return 0; }
相关文章推荐
- PKU2155 matrix
- PKU2155 Matrix [1PE 1AC][08.08.23]
- [PKU 2155]Matrix(二维树状数组)
- POJ 2155 Matrix(典型的二维树状数组)
- poj 2155 Matrix 二维树状数组
- poj2155 树状数组 Matrix
- POJ 2155 Matrix <树状数组 + 矩阵翻转>
- 【树状数组(二维)】poj 2155 Matrix
- POJ 2155 Matrix 已翻译
- POJ 2155 Matrix (二维线段树)
- POJ 2155 Matrix 二维线段树 区间修改 单点查询
- poj2155 Matrix(经典二维树状数组)
- poj 2155:Matrix(二维线段树,矩阵取反,好题)
- POJ - 2155 Matrix 树状数组
- poj 2155 Matrix
- POJ 2155——Matrix(树套树,二维树状数组,二维线段树)
- POJ 2155 Matrix(二维树状数组,绝对具体)
- poj 2155 Matrix
- POJ 2155 Matrix
- poj 2155 Matrix 二维树状数组