树状数组的区间修改+查询
首先看树状数组是用来求前缀和比较方便的一种数据结构
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;
}
树状数组的区间修改+查询相关推荐
- 树状数组之区间修改单点查询
树状数组的区间修改单点查询 树状数组其实本质还单点修改区间查询,但是我们怎么延伸到这个呢,我们建立一个差分数组, 比如: a[10]={4, 6, 7, 5, 1, 6, ...
- 二维树状数组模板(区间修改+区间查询)
二维树状数组模板(区间修改+区间查询) 例题:JOIOI上帝造题的七分钟 一共两种操作: \(L\ x_1\ y_1\ x_2\ y_2\ d\):把\((x_1,y_1)\),\((x_2,y_2) ...
- 【LuoguP3038/[USACO11DEC]牧草种植Grass Planting】树链剖分+树状数组【树状数组的区间修改与区间查询】...
模拟题,可以用树链剖分+线段树维护. 但是学了一个厉害的..树状数组的区间修改与区间查询.. 分割线里面的是转载的: ----------------------------------------- ...
- 分块的单点修改查询区间和_树状数组的区间修改与单点查询与区间查询
如何将普通树状数组升级 普通的单点修改单点查询就不讲了,从区间修改和单点查询讲起. 原来的值存在a[]里面,多建立个数组c1[],注意:c1[i]=a[i]-a[i-1]. 那么求a[i]的值的时候a ...
- 树状数组求区间和模板 区间可修改 参考题目:牛客小白月赛 I 区间
从前有个东西叫树状数组,它可以轻易实现一些简单的序列操作,比如单点修改,区间求和;区间修改,单点求值等. 但是我们经常需要更高级的操作,比如区间修改区间查询.这时候树状数组就不起作用了,只能选择写一个 ...
- 数据结构一【树状数组】普通、二维、离线树状数组的(单点修改,单点查询,区间修改,区间查询)模板及应用例题总结
文章目录 树状数组 lowbit 线段树与树状数组 单点修改 区间查询 区间修改 区间求和 二维树状数组 离线树状数组 例题 POJ:stars MooFest [SDOI2009]HH的项链 Tur ...
- 树状数组(单点修改,区间修改等)
前言:上次练习树状数组的专题还是半年前,练了练就过了,后来学了线段树,觉得树状数组这啥啊,线段树不香吗,就再也没管过树状数组了.直到几天前被树状数组血虐了,急忙爬回来补树状数组.(事实证明学的越少,越 ...
- 树状数组维护区间和的模型及其拓广的简单总结
by wyl8899 树状数组的基本知识已经被讲到烂了,我就不多说了,下面直接给出基本操作的代码. 假定原数组为a[1..n],树状数组b[1..n],考虑灵活性的需要,代码使用int *a传数组. ...
- Billboard HDU - 2795(树状数组,单点修改,区间查询)
题目链接:https://vjudge.net/problem/HDU-2795 思路:h = 1e9行不通,因为广告是1*w的,所以n个广告最多只需要 h = n的高度,那么h=2e5就可以接受了. ...
最新文章
- [Notice]博客地址转移 vitostack.com
- git中查看和设置 用户名、密码
- 【Android 插件化】VirtualApp 接入 ( 安装 APK 插件应用 | 启动插件 APK 应用 | MainActivity 安装启动插件完整代码 )
- Prototype Pattern(原型模式)
- 工信部制定VR行业标准-谋定研究:对话中国经济和信息化
- 2021热度不减的在线教育,正在努力成为线下教育的有益补充
- 【CyberSecurityLearning 75】DC系列之DC-6渗透测试(WordPress)
- Snuke Festival(二分法)
- 八、开发者工具和指南(四) Orchard dependencies and libraries
- 《Adobe Illustrator CC 2014中文版经典教程(彩色版)》—第1课0.8节编辑描边
- DreamFactory入门指南
- asp.net试题(三)
- WebStrom的学习使用 H5开发
- 对double变量进行四舍五入并保留两位小数
- Moodle 安装的时候提示 original IP
- 昂达V971四核测评
- Linux下小巧的取色精灵gcolor2
- 在腾讯待了 9 年还离了职
- codeblocks改变主题背景颜色
- win7 64蓝牙耳机连接问题
热门文章
- context:component-scan扫描使用的use-default-filters
- Plist文件和字典转模型
- HDOJ1014 Uniform Generator
- iframe带了token不显示_不就是登录吗,能有多复杂?sa-token带你轻松搞定多地登陆、单地登录、同端互斥登录...
- Dom对象、JavaScript对象、jQuery对象区别
- android图片查看器,实现图片加载进度监听,实现保存图片
- android TextView下划线,圆角边框,数逐字显示,虚线边框, 渐变色背景框, 阴影背景框
- vue项目中assets与static的区别
- 使用WINPE在硬盘安装WIN7系统
- IIS Service Unavailable问题