博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【学习整理】树状数组 区间修改+查询
阅读量:5107 次
发布时间:2019-06-13

本文共 1149 字,大约阅读时间需要 3 分钟。

前言:对于区间修改和区间查询这样的简单问题,打一大堆线段树确实是不划算,所以学习了区间修改+区间修查询的树状数组。

我们定义 a[i] 为原数列,c[i]=a[i]-a[i-1] ,显然  a[n]=\displaystyle{\sum_{i=1}^{n}}c[i]

若想要将区间 [l,r] 的数全部 +v 则只需要将 c[l]+v , c[r+1]-v 即可。

{\sum_{i=1}^{n}}a[i]=(c[1])+(c[1]+c[2])+...+(c[1]+c[2]+...+c[n])

              =n$\times$c[1]+(n-1)$\times$c[2]+...+c[n]

              =n$\times$(c[1]+c[2]+...+c[n])-(0$\times$c[1]+1$\times$c[2]+...+(n-1)$\times$c[n])

所以,我们维护一个数组 c_2[i]=(i-1)$\times$c[i] 

在将区间 [l,r] 的数全部 +v 则还需同时将 c_2[l]+v$\times$(i-1) , c_2[r+1]+(-v)$\times$r

结论:{\sum_{i=1}^{n}}a[i]=n$\times${\sum_{i=1}^{n}}c[i]-{\sum_{i=1}^{n}}c_2[i]

 

例题:CODEVS1082 线段树练习3

 

 

#include
#include
#include
#include
#include
#include
using namespace std;int n,q;long long a[200005],c[3][200005];long long lowbit(long long x){ return x&(-x);}void modify(int x,long long pos,long long v){ for(;pos<=n;pos+=lowbit(pos)) c[x][pos]+=v;}long long query(int x,long long pos){ long long ret=0LL;for(;pos;pos-=lowbit(pos)) ret+=c[x][pos];return ret;}int main(){ int i,j,opt; long long l,r,v,sum1,sum2; scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%lld",&a[i]); modify(1,i,a[i]-a[i-1]); modify(2,i,(i-1)*(a[i]-a[i-1])); } scanf("%d",&q); for(i=1;i<=q;i++) { scanf("%d%lld%lld",&opt,&l,&r); if(opt==1) { scanf("%lld",&v); modify(1,l,v);modify(1,r+1,-v); modify(2,l,v*(l-1));modify(2,r+1,-v*r); } else { sum1=(l-1)*query(1,l-1)-query(2,l-1); sum2=r*query(1,r)-query(2,r); printf("%lld\n",sum2-sum1); } } return 0; }

转载于:https://www.cnblogs.com/yljiang/p/6057394.html

你可能感兴趣的文章
Map不同具体实现类的比较和应用场景的分析
查看>>
Aptana环境下配置xdebug
查看>>
IIS7:通过脚本来配置ftp站点
查看>>
No.012:Integer to Roman
查看>>
Tomcat简介
查看>>
解决Install failed uid changed
查看>>
Mac OS command line TestNG - “Cannot find class in classpath” error
查看>>
LA 3641 (置换 循环的分解) Leonardo's Notebook
查看>>
org.apache.common.math3 学习笔记
查看>>
access检测表没有的字段,添加之
查看>>
相对论的时间计算
查看>>
最大堆算法
查看>>
spring4新特性 泛型依赖注入
查看>>
mysql-备份恢复
查看>>
leetcode 90. 子集 II(Subsets II)
查看>>
Linux最大打开文件描述符数
查看>>
leetcode: Count and Say
查看>>
Access VBA-用Find或Seek方法实现查找符合条件的记录
查看>>
jquery Ajax标准规范写法
查看>>
MySQL Order By实现原理分析和Filesort优化
查看>>