[POJ 2155] Matrix (高维树状数组)
2016-04-27 21:31
651 查看
POJ - 2155
给定一个矩阵,开始时其元素全为 0,有两个操作C x1 y1 x2 y2 将左上角为 (x1,y1),右下角为 (x2,y2)的子矩阵里的元素取反
Q x y 询问(x,y)元素的值
裸的二维树状数组,知道了套路以后还是很好做的
add2(x1,y1,1);add2(x1,y2+1,-1);
add2(x2+1,y1,-1);add2(x2+1,y2+1,1)
根据树状数组在一个地方加值,其后的元素全部都加同一个值
用以上四个操作,把多加的扣掉,多扣的加回来即可
#include <cstdio> #include <iostream> #include <cstdlib> #include <cstring> #include <algorithm> #include <cmath> #include <map> #include <set> #include <queue> using namespace std; typedef pair<int,int> Pii; typedef long long LL; typedef unsigned long long ULL; typedef double DBL; typedef long double LDBL; #define MST(a,b) memset(a,b,sizeof(a)) #define CLR(a) MST(a,0) #define Pow2(a) (a*a) const int maxn=1e3+10; int N,M; int Bit2[maxn][maxn]; int lowbit(int x){return x&-x;} void add2(int,int,int); int sum2(int,int); int main() { int T; scanf("%d", &T); for(int ck=1; ck<=T; ck++) { CLR(Bit2); scanf("%d%d", &N, &M); for(int m=0; m<M; m++) { char opt; int x,y,xx,yy; scanf(" %c", &opt); if(opt=='C') { scanf("%d%d%d%d", &x, &y, &xx, &yy); add2(x,y,1);add2(xx+1,y,-1); add2(x,yy+1,-1);add2(xx+1,yy+1,1); } else { scanf("%d%d", &x, &y); printf("%d\n", sum2(x,y)&1); } } if(ck<T) puts(""); } return 0; } void add2(int x, int y, int v) { for(int i=x; i<=N; i+=lowbit(i)) { for(int j=y; j<=N; j+=lowbit(j)) { Bit2[i][j]+=v; } } } int sum2(int x,int y) { int res=0; for(int i=x; i>0; i-=lowbit(i)) { for(int j=y; j>0; j-=lowbit(j)) { res+=Bit2[i][j]; } } return res; }
相关文章推荐
- 安装Redis完整过程
- 剑指offer(42):数组中只出现1次的数字
- 受限玻尔兹曼机(Restricted Boltzmann Machine,RBM)
- 回文字符串
- 解决spring mvc中ajax传值所报的错误400 415
- leetcode-20. Valid Parentheses
- 【Linux】Red Hat Linux 图形界面切换命令界面
- Mybatis最入门---分页查询(拦截器分页原理及实现)
- python中文编码坑
- Power Designer使用方法
- UVA 10245 The Closest Pair Problem【分治】
- JAVA——如何停止线程呢?(interrupt)
- 杭电2006
- 如何避免大量重复URL被百度收录
- UVA 10245 The Closest Pair Problem【分治】
- UVA 10245 The Closest Pair Problem【分治】
- 透过代理获取客户端请求的真实ip
- leetcode 86. Partition List
- php示例代码
- leetcode 046 Permutations