分块的单点修改查询区间和_树状数组的区间修改与单点查询与区间查询
如何将普通树状数组升级
普通的单点修改单点查询就不讲了,从区间修改和单点查询讲起。
原来的值存在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));
}
}
}
分块的单点修改查询区间和_树状数组的区间修改与单点查询与区间查询相关推荐
- 树状数组之区间修改单点查询
树状数组的区间修改单点查询 树状数组其实本质还单点修改区间查询,但是我们怎么延伸到这个呢,我们建立一个差分数组, 比如: a[10]={4, 6, 7, 5, 1, 6, ...
- 树状数组的区间修改+查询
首先看树状数组是用来求前缀和比较方便的一种数据结构 sum[i] = Sigma a[i] =Sum(bit[x]) 而区间修改也不难实现 就是引入一个差分数组del del[i]表示对i~n的修改 ...
- 树状数组求区间和模板 区间可修改 参考题目:牛客小白月赛 I 区间
从前有个东西叫树状数组,它可以轻易实现一些简单的序列操作,比如单点修改,区间求和;区间修改,单点求值等. 但是我们经常需要更高级的操作,比如区间修改区间查询.这时候树状数组就不起作用了,只能选择写一个 ...
- 二维树状数组模板(区间修改+区间查询)
二维树状数组模板(区间修改+区间查询) 例题:JOIOI上帝造题的七分钟 一共两种操作: \(L\ x_1\ y_1\ x_2\ y_2\ d\):把\((x_1,y_1)\),\((x_2,y_2) ...
- 【LuoguP3038/[USACO11DEC]牧草种植Grass Planting】树链剖分+树状数组【树状数组的区间修改与区间查询】...
模拟题,可以用树链剖分+线段树维护. 但是学了一个厉害的..树状数组的区间修改与区间查询.. 分割线里面的是转载的: ----------------------------------------- ...
- 树状数组维护区间和的模型及其拓广的简单总结
by wyl8899 树状数组的基本知识已经被讲到烂了,我就不多说了,下面直接给出基本操作的代码. 假定原数组为a[1..n],树状数组b[1..n],考虑灵活性的需要,代码使用int *a传数组. ...
- HDU-4777 Rabbit Kingdomom(树状数组、区间离线)
title: HDU-4777 Rabbit Kingdomom(树状数组.区间离线) date: 2018-12-14 11:20:15 tags: [树状数组,离线,区间] categories: ...
- ACM学习历程—51NOD 1685 第K大区间2(二分 树状数组 中位数)
http://www.51nod.com/contest/problem.html#!problemId=1685 这是这次BSG白山极客挑战赛的E题. 这题可以二分答案t. 关键在于,对于一个t,如 ...
- 求序列最长不下降子序列_树状数组解决最长不下降子序列 讲讲主要思路就好...
展开全部 不降子序列求的是一个元素的值单调e69da5e887aa62616964757a686964616f31333361306430不降的序列. 传统的状态设计便是使用f[n] 表示到达第n位时 ...
最新文章
- android自定义tab下划线变大,Android开发之设置TabLayout下方下划线的宽度
- java中单例设计模式登记式单例类_java23种设计模式-创建型模式之单例模式
- 【自适应盲均衡4】基于RLS的多径衰落信道均衡算法(RLS-CMA)的理论推导与MATLAB仿真
- 双“11”搞促销?用贪心算法来盘他!
- 关于Socket通信服务的心跳包(转)
- 绝对位置,但相对于父位置
- P5231 [JSOI2012]玄武密码
- 小D课堂 - 新版本微服务springcloud+Docker教程_4-05 微服务调用方式之feign 实战 订单调用商品服务...
- 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第2节 Stream流式思想概述_3_流式思想概述...
- 用51单片机怎么玩SG90舵机?
- 【资料】舵机控制原理
- rman的conver方法拷贝ASM文件
- 中兴手机怎么与计算机连接网络连接不上,手机可以连接wifi电脑连接不上怎么办?...
- array_column() expects parameter 1 to be array, array given
- 微信和抖音都到十亿级用户了,作为产品经理的你们觉得哪个产品更成功?
- 3D游戏之投影矩阵算法技术实现
- 最新推出SAP ECC EHP7最新版本IDES带演示数据,带开发ACCESS KEY。
- finalize()的真正用法及作用
- 设置Windows默认登录方式为智能卡登录
- 从苏宁电器到卡巴斯基第24篇:单证这一年(下)
热门文章
- 全面解析YOLO V4网络结构
- 进阶必备:CNN经典论文代码复现 | 附下载链接
- 史上最强iPhone越狱工具诞生,而且是开源!
- CSS 背景(background)(背景颜色color、背景图片image、背景平铺repeat、背景位置position、背景附着、背景简写、背景透明、链接导航栏综合案例)
- python之互斥锁
- 线性回归之正则化线性模型
- HTML基础部分(1)字体,照片,链接
- 如何更改linux文件目录拥有者及用户组
- ACMNO.13求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一个数字。 输入 n 输出 和 样例输入 5 样例输出 153
- 利用CNN来检测伪造图像