树状数组总结
2016-07-28 20:21
369 查看
注意树状数组中最小的数为1,不能是0,当输入数据最小值为0时,可全体加一
树状数组初始化为0
maxb为所用最大数字,要初始化
例题:
poj 2299 Ultra-QuickSort
poj 3321 Apple Tree
poj 3067 Japan
poj 3416 Crossing
更新区间如下:
例题:poj1195 Mobile phones
1处增加后,2、3两处再减回去,到了4被减了两遍,再加回来。
![](http://img.blog.csdn.net/20160728224719498)
例题:poj 2155 Matrix
poj 2352 Stars
poj 2481 Cows
poj 3067 Japan
poj 3416 Crossing
树状数组初始化为0
1.一维单点更新、区间查询
一维单点更新、区间求和maxb为所用最大数字,要初始化
int lowbit(int x) {return x&-x} void add(int x,int val) {for(int i=x;i<=maxb;i+=lowbit(i)) bit[i]+=val;} int getsum(int x) { int res=0; for(int i=x;i>0;i-=lowbit(i)) res+=bit[i]; return res; } int query(int l,int r) {return getsum(r)-getsum(l-1);}
例题:
poj 2299 Ultra-QuickSort
poj 3321 Apple Tree
poj 3067 Japan
poj 3416 Crossing
2.一维区间更新、单点查询
此时记录每个点与前面一点的增值,则查询某 点值即为从头到这个点的增值的累和,即由getsum()得到。更新区间如下:
void update(int l,int r,int val) { add(l,val); add(r+1,-val); }
3.二维单点更新、区间查询
二维需要用容斥原理得到待求的二维区间inline int lowbit(int x){return x&-x;} void add(int x,int y,int val) { for(int i=x;i<=maxb;i+=lowbit(i)) for(int j=y;j<=maxb;j+=lowbit(j)) bit[i][j]+=val; } int getsum(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+=bit[i][j]; return res; } int calc(int x1,int y1,int x2,int y2) { return getsum(x2,y2)-getsum(x1-1,y2)-getsum(x2,y1-1)+getsum(x1-1,y1-1); }
例题:poj1195 Mobile phones
4.二维区间更新、单点查询
将一维区间更新、单点查询改为二维,同样记录的是增值。如图,更新黄色区域,用容斥原理,双斜线处增加,单斜线处减少。1处增加后,2、3两处再减回去,到了4被减了两遍,再加回来。
int lowbit(int x){return x&-x;} void add(int x,int y,int val) { for(int i=x;i<=maxb;i+=lowbit(i)) for(int j=y;j<=maxb;j+=lowbit(j)) bit[i][j]+=val; } void update(int x1,int y1,int x2,int y2,int val) { add(x1,y1,val); add(x1,y2+1,-val); add(x2+1,y1,-val); add(x2+1,y2+1,val); } int getsum(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+=bit[i][j]; return res;
例题:poj 2155 Matrix
5.[技巧]双关键字排序预处理
例题:poj 2352 Stars
poj 2481 Cows
poj 3067 Japan
poj 3416 Crossing
相关文章推荐
- 书评:《算法之美( 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)代码