POJ2155 Matrix(经典二维树状数组)
2016-08-31 10:53
218 查看
题意:
给出一个矩阵,其中的元素要么是0要么是1,现在有两种操作,一种是将一个子矩阵内的元素全部反转,一种是查询元素(x,y)对应的值。
要点:
这题是非常经典的一道二维树状数组题,难点是怎么修改子矩阵内的值,其实只要每次修改(x1,y1),(x1,y2+1),{x2+1,y1},(x2+1,y2+1)这四个点的值即可。
主要思路可以参考这个论文:点击打开链接
这个论文里有点说的不是很清楚:一维的时候为什么可以通过求sum(dx)%2来得到变化次数,其实是这样的,我们可以这么想,假如有一个区间[a,b],这个区间内的元素都要变
假设一:a<=x<=b,这样x前的元素之和+1,也就是x变化了一次。
假设二:如果a<b<x,这样x之前的元素和+2,sum%2不改变x的值。
假设三:如果a<b<x则根本不影响。
还有一个问题就是为什么要改变y+1而不是y:主要是考虑到x==y的时候,只有改变y+1才能满足上述的假设一,而x==y+1时满足假设二。
,
给出一个矩阵,其中的元素要么是0要么是1,现在有两种操作,一种是将一个子矩阵内的元素全部反转,一种是查询元素(x,y)对应的值。
要点:
这题是非常经典的一道二维树状数组题,难点是怎么修改子矩阵内的值,其实只要每次修改(x1,y1),(x1,y2+1),{x2+1,y1},(x2+1,y2+1)这四个点的值即可。
主要思路可以参考这个论文:点击打开链接
这个论文里有点说的不是很清楚:一维的时候为什么可以通过求sum(dx)%2来得到变化次数,其实是这样的,我们可以这么想,假如有一个区间[a,b],这个区间内的元素都要变
假设一:a<=x<=b,这样x前的元素之和+1,也就是x变化了一次。
假设二:如果a<b<x,这样x之前的元素和+2,sum%2不改变x的值。
假设三:如果a<b<x则根本不影响。
还有一个问题就是为什么要改变y+1而不是y:主要是考虑到x==y的时候,只有改变y+1才能满足上述的假设一,而x==y+1时满足假设二。
16040779 | Seasonal | 2155 | Accepted | 4484K | 454MS | C++ | 963B | 2016-08-31 10:23:52 |
#include<iostream> #include<string.h> #include<algorithm> using namespace std; int n; int map[1050][1050]; int lowbit(int x) { return x&(-x); } void add(int x,int y,int w) { for (int i = x; i <= n; i += lowbit(i)) for (int j = y; j <= n; j += lowbit(j)) map[i][j] += w; } int sum(int x, int y) { int temp = 0; for (int i = x; i > 0; i -= lowbit(i)) for (int j = y; j > 0; j -= lowbit(j)) temp += map[i][j]; return temp; } int main() { int t; scanf("%d", &t); while (t--) { int p; memset(map, 0, sizeof(map)); scanf("%d%d", &n, &p); while (p--) { char order[5]; scanf("%s", order); if (order[0] == 'C') { int x1, y1, x2, y2; scanf("%d%d%d%d", &x1, &y1, &x2, &y2); add(x1, y1, 1); add(x2 + 1, y1, 1); add(x1, y2 + 1, 1); add(x2 + 1, y2 + 1, 1); } else if(order[0]=='Q') { int x, y; scanf("%d%d", &x, &y); printf("%d\n", sum(x, y) % 2); } } printf("\n"); } return 0; }
,
相关文章推荐
- poj 2155 Matrix(二维树状数组)(经典)
- 【POJ2155】Matrix(二维树状数组)
- [POJ2155]Matrix(二维树状数组)
- poj 2155 Matrix(二维树状数组)(经典)
- poj2155 Matrix(经典二维树状数组)
- poj 2155 Matrix(二维树状数组)(经典)
- POJ2155:Matrix(二维树状数组,经典)
- poj 2155 Matrix(二维树状数组)(经典)
- poj 2155 Matrix(二维树状数组)(经典)
- POJ2155 Matrix(二维树状数组)
- poj 2155 Matrix(二维树状数组)(经典)
- 【POJ2155】Matrix-二维树状数组+前缀和
- poj 2155 Matrix(二维树状数组)(经典)
- poj 2155 Matrix(二维树状数组)(经典)
- poj 2155 Matrix(二维树状数组)(经典)
- (POJ 2155)Matrix (复习必看题)经典二维树状数组题目 + 树状数组的论文讲解
- POJ2155:Matrix(二维树状数组,经典)
- POJ 2155 Matrix (二维树状数组+经典题)
- poj 2155 Matrix(二维树状数组)(经典)
- POJ2155--Matrix::二维树状数组