【模板】树状数组的区间加值和区间查询
来源:互联网 发布:海量数据存储算法 编辑:程序博客网 时间:2024/06/11 10:33
树状数组可以实现单点修改区间查询,或是差分的区间修改单点查询。【点这里】
那么树状数组能不能实现区间加值区间查询呢?
原始序列为a[]。我们先考虑区间加值,用差分的方式维护一个d[]数组,d[x]表示的是[x,maxn]每个数的增量。
那么如果需要查询1~x的前缀和,需要查的是
所以把
模板题是【模板】线段树1 洛谷P3372
#include<bits/stdc++.h>#define lowbit(x) (x&(-x))using namespace std;int n,m;long long a[100005];long long tree[100005],treex[100005];inline void add(long long *ths,int x,long long num){ while(x<=n){ ths[x]+=num; x+=lowbit(x); }}inline long long search(long long *ths,int x){ long long re=0; while(x){ re+=ths[x]; x-=lowbit(x); } return re;}inline long long search(int x){ return a[x]+(x+1)*search(tree,x)-search(treex,x);}int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;++i) scanf("%lld",&a[i]),a[i]+=a[i-1]; while(m--){ int opt; scanf("%d",&opt); if(opt==1){ int l,r; long long k; scanf("%d%d%lld",&l,&r,&k); add(tree,l,k); add(tree,r+1,-k); add(treex,l,l*k);add(treex,r+1,-(r+1)*k); } else{ int l,r; scanf("%d%d",&l,&r); printf("%lld\n",search(r)-search(l-1)); } } return 0;}
阅读全文
0 0
- 【模板】树状数组的区间加值和区间查询
- 树状数组的区间修改和区间查询模板
- [模板]树状数组(区间修改单点查询)
- 【整体二分+树状数组区间加区间和】BZOJ3110 [Zjoi2013]K大数查询
- CodeVS 1082 (区间修改+区间查询树状数组模板)
- hdu1166 树状数组模板:单点更新,区间求和(区间查询)
- BZOJ 3132: 上帝造题的七分钟【树状数组(二维区间加,区间查询
- 区间信息的维护和查询系列算法-树状数组
- poj3468 树状数组的区间快速更新和查询
- 树状数组的区间修改,单点查询
- 树状数组的单点更新,区间查询。
- 树状数组模板区间更新 区间询问
- 树状数组模板区间更新 区间询问
- 可以区间修改区间查询的树状数组云云
- 【小结】树状数组的区间修改与区间查询
- 树状数组的区间修改与区间查询
- 树状数组的应用(区间修改+区间查询)
- 树状数组 区间和
- 数据类型之间的相互转换
- 生成订单号
- javascript获取项目根目录带项目名
- 13-CSS3提高
- 在C/C++语言中使用正则表达式
- 【模板】树状数组的区间加值和区间查询
- 求两个正整数均值(防溢出)
- 2017 12 10 cf 个人赛--题解 SDUT 2017 Autumn Single Contest L
- 最好用的 IntelliJ 插件 Top 10
- 漫画:什么是 volatile 关键字?
- 深度学习(十一)——Winograd(1)
- 8086汇编语言程序设计
- 国务院为何力推公共资源配置领域政府信息公开?
- SparkStreaming计算WordCount简单示例