首先看树状数组是用来求前缀和比较方便的一种数据结构
sum[i] = Sigma a[i] =Sum(bit[x])
而区间修改也不难实现
就是引入一个差分数组del
del[i]表示对i~n的修改
这样的话也就是最del[i]求前缀和 就能得到i~n的所有修改了
因为i前的每一个元素的修改都是对后面所有元素的修改
所以当我们统计i~n的修改的时候 我们需要把前面的修改项都累加起来才行
这里就可以用树状数组统计一下前缀和

也就是当我们对区间s~e修改的时候 用del[s]+add 表示对i~n的修改
但是e之后不要修改 所以我们再执行 del[e+1]-add的操作
这样当我们进行区间修改 单点查询的时候 就用原始a[i]+sum(del[i])【从1-i的信息累加之和】即可表示

当我们需要求区间查询s~e的时候
我们先来看如何求1~i的和
sigma(i) = a[1] + del[1]+ a[2]+ del[1] + del[2] +……+a[i]+del[1]+del[2]+……+del[i]
= a[1]+a[2]+……+a[i] + del[1](i)+del[2] (i-1) +……+del[i] *1
= a[1]+a[2]+……+a[i] + del[1](i-1+1)+del[2] (i-2+1) +……+del[i] *(i-i+1)
= Sigma(a[xi]) + Sigma(del[ xi ]*( i -xi +1 ) )
= Sigma(a[xi]) + Sigma(del[ xi ])* ( i +1 ) ) -Sigma(del[xi] * xi )

可知 第一个Sigma 是静态的 可以用前缀和预处理出来
第二个Sigma: i+1也是不变的 用树状数组统计差分变化 然后求和即可
第三个Sigma: 需要另开辟一个树状数组idel 统计i*del[xi]的前缀和
然后当我们修改区间段的时候 对差分数组del[s]+add 需要同时对 idel[s] + add * s因为最后一个sigma就是表示要把对差分数组的每次修改乘上修改的位置/【下标】
然后在求累加和的时候 自然而然的就把sigma(del[xi]*xi)求出来了

经典例题:
POJ- 3468 A Simple Problem with Integers 线段树区间修改+查询 | 树状数组的区间修改+查询
题意就是经典的两种操作
Q s e 表示查询s到e区间内的总和
C s e add 表示把s到e都加上一个add
区间内的元素大小1e9
区间长度和查询次数1e5

分析:
这道题虽然是课裸的线段树区间修改+查询+延迟标记
但是繁杂的代码不如用实现简单的树状数组来做
code:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn = 1e5+10;
ll a[maxn],Sum[maxn],del[maxn],idel[maxn];
// 树状数组 区间更新 区间修改
//维护三个树状数组 1 原始树状数组
//                 2 差分树状数组 del
//                 3 i*del[i] 的树状数组
int n,m;
void update(ll a[],int x,int add){while(x<=n){a[x]+=add;x+=x&(-x);}
}
ll sum(ll a[],int x){ll s1=0;int tmp = x;while(tmp>0){s1+=a[tmp];tmp-=tmp&(-tmp);}return s1;
}
int main()
{ios::sync_with_stdio(0);cin.tie(0);cin>>n>>m;for(int i=1;i<=n;i++){cin>>a[i];Sum[i] = Sum[i-1]+a[i];}while(m--){string o;int s,e,add;cin>>o;if(o[0]=='Q'){cin>>s>>e;ll ss = Sum[s-1] + s*sum(del,s-1) - sum(idel,s-1); ll se = Sum[e] + (e+1)*sum(del,e) - sum(idel,e);cout<<se-ss<<endl;}else{cin>>s>>e>>add;//维护区间差分数组 求和时需要用 (x+1)*Sigma(del[x]) update(del,s,add);update(del,e+1,-add);//维护需要减去的 i*del[i]数组 求和时需要减去 Sigma(i*del[i]) update(idel,s,s*add);update(idel,e+1,(e+1)*(-add));}} return 0;
} 

树状数组的区间修改+查询相关推荐

  1. 树状数组之区间修改单点查询

    树状数组的区间修改单点查询 树状数组其实本质还单点修改区间查询,但是我们怎么延伸到这个呢,我们建立一个差分数组, 比如:                a[10]={4, 6, 7, 5, 1, 6, ...

  2. 二维树状数组模板(区间修改+区间查询)

    二维树状数组模板(区间修改+区间查询) 例题:JOIOI上帝造题的七分钟 一共两种操作: \(L\ x_1\ y_1\ x_2\ y_2\ d\):把\((x_1,y_1)\),\((x_2,y_2) ...

  3. 【LuoguP3038/[USACO11DEC]牧草种植Grass Planting】树链剖分+树状数组【树状数组的区间修改与区间查询】...

    模拟题,可以用树链剖分+线段树维护. 但是学了一个厉害的..树状数组的区间修改与区间查询.. 分割线里面的是转载的: ----------------------------------------- ...

  4. 分块的单点修改查询区间和_树状数组的区间修改与单点查询与区间查询

    如何将普通树状数组升级 普通的单点修改单点查询就不讲了,从区间修改和单点查询讲起. 原来的值存在a[]里面,多建立个数组c1[],注意:c1[i]=a[i]-a[i-1]. 那么求a[i]的值的时候a ...

  5. 树状数组求区间和模板 区间可修改 参考题目:牛客小白月赛 I 区间

    从前有个东西叫树状数组,它可以轻易实现一些简单的序列操作,比如单点修改,区间求和;区间修改,单点求值等. 但是我们经常需要更高级的操作,比如区间修改区间查询.这时候树状数组就不起作用了,只能选择写一个 ...

  6. 数据结构一【树状数组】普通、二维、离线树状数组的(单点修改,单点查询,区间修改,区间查询)模板及应用例题总结

    文章目录 树状数组 lowbit 线段树与树状数组 单点修改 区间查询 区间修改 区间求和 二维树状数组 离线树状数组 例题 POJ:stars MooFest [SDOI2009]HH的项链 Tur ...

  7. 树状数组(单点修改,区间修改等)

    前言:上次练习树状数组的专题还是半年前,练了练就过了,后来学了线段树,觉得树状数组这啥啊,线段树不香吗,就再也没管过树状数组了.直到几天前被树状数组血虐了,急忙爬回来补树状数组.(事实证明学的越少,越 ...

  8. 树状数组维护区间和的模型及其拓广的简单总结

    by wyl8899 树状数组的基本知识已经被讲到烂了,我就不多说了,下面直接给出基本操作的代码. 假定原数组为a[1..n],树状数组b[1..n],考虑灵活性的需要,代码使用int *a传数组. ...

  9. Billboard HDU - 2795(树状数组,单点修改,区间查询)

    题目链接:https://vjudge.net/problem/HDU-2795 思路:h = 1e9行不通,因为广告是1*w的,所以n个广告最多只需要 h = n的高度,那么h=2e5就可以接受了. ...

最新文章

  1. [Notice]博客地址转移 vitostack.com
  2. git中查看和设置 用户名、密码
  3. 【Android 插件化】VirtualApp 接入 ( 安装 APK 插件应用 | 启动插件 APK 应用 | MainActivity 安装启动插件完整代码 )
  4. Prototype Pattern(原型模式)
  5. 工信部制定VR行业标准-谋定研究:对话中国经济和信息化
  6. 2021热度不减的在线教育,正在努力成为线下教育的有益补充
  7. 【CyberSecurityLearning 75】DC系列之DC-6渗透测试(WordPress)
  8. Snuke Festival(二分法)
  9. 八、开发者工具和指南(四) Orchard dependencies and libraries
  10. 《Adobe Illustrator CC 2014中文版经典教程(彩色版)》—第1课0.8节编辑描边
  11. DreamFactory入门指南
  12. asp.net试题(三)
  13. WebStrom的学习使用 H5开发
  14. 对double变量进行四舍五入并保留两位小数
  15. Moodle 安装的时候提示 original IP
  16. 昂达V971四核测评
  17. Linux下小巧的取色精灵gcolor2
  18. 在腾讯待了 9 年还离了职
  19. codeblocks改变主题背景颜色
  20. win7 64蓝牙耳机连接问题

热门文章

  1. context:component-scan扫描使用的use-default-filters
  2. Plist文件和字典转模型
  3. HDOJ1014 Uniform Generator
  4. iframe带了token不显示_不就是登录吗,能有多复杂?sa-token带你轻松搞定多地登陆、单地登录、同端互斥登录...
  5. Dom对象、JavaScript对象、jQuery对象区别
  6. android图片查看器,实现图片加载进度监听,实现保存图片
  7. android TextView下划线,圆角边框,数逐字显示,虚线边框, 渐变色背景框, 阴影背景框
  8. vue项目中assets与static的区别
  9. 使用WINPE在硬盘安装WIN7系统
  10. IIS Service Unavailable问题