树状数组两种基本的模式
来源:互联网 发布:js将数组加入到集合中 编辑:程序博客网 时间:2024/05/22 10:51
树状数数组基本的两种模式:
第一,对初始数组a[i]中的某一元素修改,查询某个区间内的所有的和,(时间复杂度都为logn)。(插点问线)
第二,随时修改数组中a[i]中的某个区间的值(O(1)的时间复杂度),查询某一个元素的值(logn的时间复杂度)。(插线问点)
第一种模式,已经在上一篇文中提到,有兴趣可以点击打开链接
这里重点学习第二种模式。修改某一区间的值,查询某一个元素的值。
在我们这里被叫做插线问点。
如果说在第一模式中c[i]中存储的是a[i-2^k+1]到a[i]的和,那么在第二模式中存储的是a[i-2^k+1]到a[i]中,每个点的值。
那么对于插入某一区间([a,b])的某值(c),那么我们就在[1-a]插入-c,在[1,b]插入c就可以。
具体代码:
void Modify(int i,int date){ while(i>0){ c[i]+=date; i-=lowbit(i); }}
上面的函数就是修改区间1-i的值date。
那么具体操作就是:
Modify(a-1,-date);Modify(b,date);
那么以上就是对区间[a,b]进行修改的具体操作。
那么,怎么去某一点的值呢?这就更简单了。
int sum(int x){ int ans=0; while(i<=n){ ans+=c[i]; i+=lowbit(i); } return ans;}
这就是树状数组的两种模式。
那么,我们也可以用数组数组求逆序对数。
用树状数组求逆序对数,就是一个在线的插点问线问题。
树状数组是一种小巧的数据结构。但是,他始终是一种数据结构,而数据结构仅仅是用来辅助解题来的。也就是,在学习树状数组的过程中要注意他的应用方面。
树状数组还有很多的应用,有待学习。
0 0
- 树状数组两种基本的模式
- 树状数组的两道基本题
- 树状数组的两种运用
- 树状数组的三种模式
- 树状数组的基本函数
- 树状数组的基本写法
- 树状数组的基本操作
- 树状数组的基本运用
- 逆序对的两种算法【树状数组 / 归并排序】
- poj 3067 树状数组的基本运用
- 树状数组基本操作
- 基本二维树状数组
- C++ 二维数组 两种基本的传参数方法
- 关于逆序对的两种做法(归并排序+树状数组c++)
- HDU1556 树状数组,线段树区间更新两种方法(主要树状数组)
- Java基础-枚举的两种基本模式
- Asp.Net Ajax的两种基本开发模式
- Asp.Net Ajax的两种基本开发模式
- 新人报道
- Berkeley DB Java Edition相关资料
- Servlet到action的问题
- 搭建高可用mongodb集群(四)—— 分片
- c#正则表达式
- 树状数组两种基本的模式
- jQuery命名空间,自定义空间及属性,插件开发全解析
- 手机里面的照片被误删了怎么找回?
- 【Java】ArrayList 的 toArray() 方法抛出 ClassCastException 异常
- strcpy/memcpy/memmove的实现
- 机房收费系统总结五:思想总结
- 题目1370:数组中出校次数超过一半的数字
- G
- 漫谈C++深浅拷贝