[树状数组] poj 2155 Matrix
2016-07-27 10:39
441 查看
题目分析
二维的区间更新单点查询。区间更新、单点查询在树状数组中记录的是“增值”。如图一,更新黄色区域,用容斥原理,双斜线处增加,单斜线处减少。1处增加后,2、3两处再减回去,到了4被减了两遍,再加回来。
代码
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<cmath> #include<algorithm> #include<map> using namespace std; const int maxn=1005; int n,q; bool bit[maxn][maxn]; inline int lowbit(int x){return x&-x;} void add(int x,int y) { for(int i=x;i<=n;i+=lowbit(i)) for(int j=y;j<=n;j+=lowbit(j)) bit[i][j]=!bit[i][j]; } void update(int x1,int y1,int x2,int y2) { add(x1,y1); add(x1,y2+1); add(x2+1,y1); add(x2+1,y2+1); } int getsum(int x,int y) { bool res=0; for(int i=x;i>0;i-=lowbit(i)) for(int j=y;j>0;j-=lowbit(j)) res^=bit[i][j]; return res; } char op[2]; int main() { int T; cin>>T; while(T--) { cin>>n>>q; int x1,y1,x2,y2; for(int i=1;i<=n;i++) memset(bit[i],0,(n+1)*sizeof(int)); while(q--) { scanf("%s%d%d",op,&x1,&y1); if(op[0]=='C') { scanf("%d%d",&x2,&y2); update(x1,y1,x2,y2); } else cout<<getsum(x1,y1)<<endl; } if(T) cout<<endl; } return 0; }
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- C#数据结构之顺序表(SeqList)实例详解
- C#递归算法之分而治之策略
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- C#算法之大牛生小牛的问题高效解决方法
- Lua教程(七):数据结构详解
- C#算法函数:获取一个字符串中的最大长度的数字
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- 经典排序算法之冒泡排序(Bubble sort)代码