如何将普通树状数组升级

普通的单点修改单点查询就不讲了,从区间修改和单点查询讲起。

原来的值存在a[]里面,多建立个数组c1[],注意:c1[i]=a[i]-a[i-1]。

那么求a[i]的值的时候a[i]=a[i-1]+c1[i]=a[i-2]+c1[i]+c1[i-1]=…..=c1[1]+c1[2]+…+c1[i]。

所以就用c1[]建立树状数组,便可以很快查询a[i]的值。不多说,见代码。

#include#include

#define lb(x) x&-x

#define maxn 1000000

#define in(x) scanf("%d",&x)

#define in3(x,y,z) scanf("%d%d%d",&x,&y,&z)

using namespacestd;inta[maxn],c1[maxn],n,m,val,x,y,temp;void update(int x,intval)

{while(x<=n)

{

c1[x]+=val;

x+=lb(x);

}

}int sum(intx)

{int ans=0;while(x)

{

ans+=c1[x];

x-=lb(x);

}returnans;

}

main(){in(n);in(m);for(int i=1;i<=n;i++)

{in(a[i]);

update(i,a[i]-a[i-1]);

}while(m--)

{in(temp);if(temp==1)

{in(x);

printf("%d\n",sum(x));

}else{

in3(x,y,val);

update(x,val);

update(y+1,-val);

}

}

}

自认为还是比较好看懂的,接下来是区间修改和区间查询了。

我们用sum(1,k)表示区间1到k的和。

那么sum(1,k)=c1(1)+(c1(2)+c1(2))+(c1(1)+c1(2)+c1(3))+…+(c1(1)+c1(2)+…+c1(k))。

然后我们把式子打开。

sum(1,k)=k*(c1(1)+c1(2)+c1(3)+…+c1(k))-(0*c1*(1)+1*c1(2)+2*c1(3)+…+(k-1)*c1(k))。

是不是有些小激动,我们可以多建立一个数组c2[],c2[n]用来存(n-1)*c1(n),并且把c2数组也建立成树状数组,那么问题就迎刃而解了。

详见代码:

#include#include

#define lb(x) x&-x

#define maxn 1000000

#define in(x) scanf("%d",&x)

#define in3(x,y,z) scanf("%d%d%d",&x,&y,&z)

using namespacestd;inta[maxn],c1[maxn],c2[maxn],n,m,val,x,y,temp;void update(int *q,int x,intval)

{while(x<=n)

{

q[x]+=val;

x+=lb(x);

}

}int getsum(int *q,intx)

{int ans=0;while(x)

{

ans+=q[x];

x-=lb(x);

}returnans;

}int sum(intx)

{intans1,ans2;

ans1=x*getsum(c1,x);

ans2=getsum(c2,x);return ans1-ans2;

}int inquire(int x,inty)

{intans1,ans2;

ans1=sum(y);

ans2=sum(x-1);return ans1-ans2;

}

main() {in(n);in(m);for(int i=1; i<=n; i++)

{in(a[i]);

update(c1,i,a[i]-a[i-1]);

update(c2,i,(i-1)*(a[i]-a[i-1]));

}for(int i=1; i<=m; i++)

{in(temp);if(temp==1)

{

in3(x,y,val);

update(c1,x,val);

update(c1,y+1,-val);

update(c2,x,(x-1)*val);

update(c2,y+1,-y*val);

}else{in(x);in(y);

printf("%d\n",inquire(x,y));

}

}

}

分块的单点修改查询区间和_树状数组的区间修改与单点查询与区间查询相关推荐

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

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

  2. 树状数组的区间修改+查询

    首先看树状数组是用来求前缀和比较方便的一种数据结构 sum[i] = Sigma a[i] =Sum(bit[x]) 而区间修改也不难实现 就是引入一个差分数组del del[i]表示对i~n的修改 ...

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

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

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

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

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

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

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

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

  7. HDU-4777 Rabbit Kingdomom(树状数组、区间离线)

    title: HDU-4777 Rabbit Kingdomom(树状数组.区间离线) date: 2018-12-14 11:20:15 tags: [树状数组,离线,区间] categories: ...

  8. ACM学习历程—51NOD 1685 第K大区间2(二分 树状数组 中位数)

    http://www.51nod.com/contest/problem.html#!problemId=1685 这是这次BSG白山极客挑战赛的E题. 这题可以二分答案t. 关键在于,对于一个t,如 ...

  9. 求序列最长不下降子序列_树状数组解决最长不下降子序列 讲讲主要思路就好...

    展开全部 不降子序列求的是一个元素的值单调e69da5e887aa62616964757a686964616f31333361306430不降的序列. 传统的状态设计便是使用f[n] 表示到达第n位时 ...

最新文章

  1. android自定义tab下划线变大,Android开发之设置TabLayout下方下划线的宽度
  2. java中单例设计模式登记式单例类_java23种设计模式-创建型模式之单例模式
  3. 【自适应盲均衡4】基于RLS的多径衰落信道均衡算法(RLS-CMA)的理论推导与MATLAB仿真
  4. 双“11”搞促销?用贪心算法来盘他!
  5. 关于Socket通信服务的心跳包(转)
  6. 绝对位置,但相对于父位置
  7. P5231 [JSOI2012]玄武密码
  8. 小D课堂 - 新版本微服务springcloud+Docker教程_4-05 微服务调用方式之feign 实战 订单调用商品服务...
  9. 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第2节 Stream流式思想概述_3_流式思想概述...
  10. 用51单片机怎么玩SG90舵机?
  11. 【资料】舵机控制原理
  12. rman的conver方法拷贝ASM文件
  13. 中兴手机怎么与计算机连接网络连接不上,手机可以连接wifi电脑连接不上怎么办?...
  14. array_column() expects parameter 1 to be array, array given
  15. 微信和抖音都到十亿级用户了,作为产品经理的你们觉得哪个产品更成功?
  16. 3D游戏之投影矩阵算法技术实现
  17. 最新推出SAP ECC EHP7最新版本IDES带演示数据,带开发ACCESS KEY。
  18. finalize()的真正用法及作用
  19. 设置Windows默认登录方式为智能卡登录
  20. 从苏宁电器到卡巴斯基第24篇:单证这一年(下)

热门文章

  1. 全面解析YOLO V4网络结构
  2. 进阶必备:CNN经典论文代码复现 | 附下载链接
  3. 史上最强iPhone越狱工具诞生,而且是开源!
  4. CSS 背景(background)(背景颜色color、背景图片image、背景平铺repeat、背景位置position、背景附着、背景简写、背景透明、链接导航栏综合案例)
  5. python之互斥锁
  6. 线性回归之正则化线性模型
  7. HTML基础部分(1)字体,照片,链接
  8. 如何更改linux文件目录拥有者及用户组
  9. ACMNO.13求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一个数字。 输入 n 输出 和 样例输入 5 样例输出 153
  10. 利用CNN来检测伪造图像