数据结构
大鳄梨12138
这个作者很懒,什么都没留下…
展开
-
树状数组 区间更新区间查询
令原数组为A,差分数组为D 建立两个树状数组,一个存储差分数组,一个存储(i−1)⋅D i数组。 #include<iostream> using namespace std; int n,m; int a[100010]={0},d1[100010],d2[100010]; int lowbit(int x) { return x&(-x); } void query(int cnt,int x) { int t=cnt; while(cnt<=n) { d1[c原创 2020-05-17 12:43:52 · 172 阅读 · 0 评论 -
树状数组 区间更新单点查询
在单点更新的基础上运用差分的思想来构建树状数组。 对于一个数组A,建立数组D来记录数组A中连续数值的差值,即D【i】=A【i】-A【i-1】。 而A【i】=D【1】+D【2】+…+D【i】。 如果对数组A进行区间更新,将区间【L-R】每个数加上X,对于数组D来说,【L-R】的值是不发生变化的,D【l-1】会增加X,D【R+1】会减小X,所以区间更新A时只需要更改D数组中D【l-1】,D【R+1】两项的值即可。然后对D建立树状数组。 #include<iostream> using namespa原创 2020-05-14 19:17:03 · 281 阅读 · 0 评论 -
树状数组 单点更新区间查询
黑色为原数组,红色即为树状数组,通过lowbit求得“子节点”或者“父节点”。 求区间和操作类似前缀和,区间【L,R】的和为树状数组【R】–树状数组【L-1】。 修改和查询的时间复杂度均为O(logN)。 代码简单系数小。 功能有限处理不了复杂区间问题。 #include<iostream> using namespace std; int n,m; int a[1000010];//树状数组 int lowbit(int x) { return x&(-x); } void up.原创 2020-05-14 17:55:36 · 153 阅读 · 0 评论