题解报告:Luogu P3368 【模板】树状数组 2(区间修改,单点查询)
题目描述
如题,已知一个数列,你需要进行下面两种操作:
1.将某区间每一个数数加上x
2.求出某一个数的值
输入输出格式
输入格式:
第一行包含两个整数N、M,分别表示该数列数字的个数和操作的总个数。
第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值。
接下来M行每行包含2或4个整数,表示一个操作,具体如下:
操作1: 格式:1 x y k 含义:将区间[x,y]内每个数加上k
操作2: 格式:2 x 含义:输出第x个数的值
输出格式:
输出包含若干行整数,即为所有操作2的结果。
输入输出样例
5 5
1 5 4 2 3
1 2 4 2
2 3
1 1 5 -1
1 3 5 7
2 4
6
10
说明
时空限制:1000ms,128M
数据规模:
对于30%的数据:N<=8,M<=10
对于70%的数据:N<=10000,M<=10000
对于100%的数据:N<=500000,M<=500000
样例说明:

故输出结果为6、10
解题思路:前面已经讲过树状数组的单点修改,单点(区间)查询了。对于这道题要求的是区间修改,单点查询,怎么实现呢?首先来引入差分思想:假设原数组为A[],差分数组为d[],树状数组为C[](C数组和单点修改那个树状数组一样记录着某段区间的总和),则差分数组d[i]=A[i]-A[i-1](A[0]=0),即记录当前i位置的元素与前一个元素的差值,那么单点查询A[i]的值只需求d[i]的前缀和,即
(A[i]=d[1]+d[2]+...+d[i])。区间修改怎么利用差分数组呢?举个例子:设A[]={1,5,4,2,3},那么d[]={1,,-1,-2,},树状数组C[]={1,,-1,2,},假设区间[2,4]中每个元素都加上2,则A[]={1,7,6,4,3},那么d[]={1,,-1,-2,-1},树状数组C[]={1,,-1,4,-1},修改后可以发现d数组中只有d[2]和d[5]改变了,而且d'[2]=d[2]+2=+2=,d'[5]=d[5]-2=-2=-1,并且区间[3,4]中每个元素的差值d[i]不变,这是因为区间[2,4]中每个元素是同时加上2的。因此,当对区间[l,r]中每个元素加上k(区间修改)时,因为A[l]与前一个元素A[l-1]的差值增加了k,A[r+1]与A[r]的差值减少了k,所以只需对差分树组进行操作:d[l]+=k,d[r+1]-=k,又因为树状数组维护着差分数组,所以实际效果上也是对树状数组进行操作:C[l]+=k,C[r+1]-=k。输入的时候只需将差分数组建树,其他代码操作基本不变,单点查询时只需调用一次query(x)即可。
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn=5e5+;
int n,m,p,x,y;LL k,C[maxn],val[maxn];//C为差分数组
void add(int x,LL val){
while(x<=n){C[x]+=val;x+=(x&-x);}
}
LL query(int x){
LL ans=;
while(x>){ans+=C[x];x-=(x&-x);}
return ans;
}
int main(){
while(~scanf("%d%d",&n,&m)){
memset(C,,sizeof(C));val[]=;//注意val[0]要初始化为0
for(int i=;i<=n;++i){
scanf("%lld",&val[i]);
add(i,val[i]-val[i-]);//差分思想
}
while(m--){
scanf("%d",&p);
if(p==){scanf("%d%d%lld",&x,&y,&k);add(x,k);add(y+,-k);}
else{scanf("%d",&x);printf("%lld\n",query(x));}//单点查询
}
}
return ;
}
题解报告:Luogu P3368 【模板】树状数组 2(区间修改,单点查询)的更多相关文章
- 洛谷 P3368 【模板】树状数组 2(区间修改点查询)
题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上x 2.求出某一个数的值 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. ...
- hdu1556树状数组的区间更新单点查询
Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- 【LuoguP3038/[USACO11DEC]牧草种植Grass Planting】树链剖分+树状数组【树状数组的区间修改与区间查询】
模拟题,可以用树链剖分+线段树维护. 但是学了一个厉害的..树状数组的区间修改与区间查询.. 分割线里面的是转载的: ----------------------------------------- ...
- POJ 2155 Matrix 【二维树状数组】(二维单点查询经典题)
<题目链接> 题目大意: 给出一个初始值全为0的矩阵,对其进行两个操作. 1.给出一个子矩阵的左上角和右上角坐标,这两个坐标所代表的矩阵内0变成1,1变成0. 2.查询某个坐标的点的值. ...
- POJ2155【二维树状数组,区间修改,点查询?】【又被输入输出坑】
这题反反复复,到现在才过. 这道题就是树状数组的逆用,用于修改区间内容,查询点的值. 如果单纯就这个奇偶数来判的话,似乎这个思路比较好理解. 看了一下国家集训队论文(囧),<关于0与1在信息学奥 ...
- gym102220H 差分+树状数组(区间修改和输出)
这题目很有意思,让我学会了树状数组的差分,更加深刻理解了树状数组 树状数组的差分写法 void add(int x,int k) { for (int i = x;i <= n;i += low ...
- A Simple Problem with Integers poj 3468 多树状数组解决区间修改问题。
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 69589 ...
- 【树状数组区间修改单点查询+分组】HDU 4267 A Simple Problem with Integers
http://acm.hdu.edu.cn/showproblem.php?pid=4267 [思路] 树状数组的区间修改:在区间[a, b]内更新+x就在a的位置+x. 然后在b+1的位置-x 树状 ...
- 树状数组求区间和模板 区间可修改 参考题目:牛客小白月赛 I 区间
从前有个东西叫树状数组,它可以轻易实现一些简单的序列操作,比如单点修改,区间求和;区间修改,单点求值等. 但是我们经常需要更高级的操作,比如区间修改区间查询.这时候树状数组就不起作用了,只能选择写一个 ...
- poj3468树状数组的区间更新,区间求和
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 47174 ...
随机推荐
- kvm虚拟化学习笔记(二)之linux kvm虚拟机安装
KVM虚拟化学习笔记系列文章列表----------------------------------------kvm虚拟化学习笔记(一)之kvm虚拟化环境安装http://koumm.blog.51 ...
- c++之函数对象、bind函数
函数对象实质上是一个实现了operator()--括号操作符--的类. class Add { public: int operator()(int a, int b) { return a + b; ...
- topcoder srm 550
div1 250pt: 题意:有个机器人,从某一点出发,他只有碰到地形边缘或者碰到走过的点时才会改变运动方向,然后接着走,现在给出他的运动轨迹,判断他的运动是否合法,如果合法的话,那么整个地形的最小面 ...
- Windows和linux双系统——改动默认启动顺序
电脑上装了Windows 7和Ubantu双系统,因为Linux系统用的次数比較少而且还是默认的启动项对此非常不能容忍,因此得改动Windows为默认的启动项. 因为电脑上的系统引导程序是GRUB,因 ...
- 在EasyUI的DataGrid中嵌入Combobox
在做项目时,须要在EasyUI的DataGrid中嵌入Combobox,花了好几天功夫,在大家的帮助下,最终看到了它的庐山真面: 核心代码例如以下: <html> <head> ...
- LoadRunner 事务响应时间的组成
事务时间 一个事务的时间是指持续时间,事务会完全记录下从事务开始到事务结束之间的时间差,那么事务的时间能真实地反映业务操作的时间吗?不能,就好像人用手按秒表来记录短跑时间一样,得出的时间并不是完全准确 ...
- XxPay支付系统-boot版本 使用
https://segmentfault.com/a/1190000016987391?utm_source=tag-newest 有三个版本: spring boot 版本: spring clou ...
- Android进阶图片处理之三级缓存方案
图片的三级缓存 一.概述 一開始在学习Android的时候.处理图片的时候,每次获取图片都是直接从网络上面载入图片. 可是在开发项目的过程中,每次点击进入app里面,图片都要慢慢的再一次从网络上面载入 ...
- HBuilder开发App教程05-滴石和websql
滴石 介绍 滴石是用HBuilder开发的一款计划类app. 用到HBuilder,mui.nativejs以及h5一些特性. 预期 眼下仅仅开发到todolist级别, 以后计划做成日计划,月计划, ...
- 点滴记录——Ubuntu 14.04中Chrome浏览器标题栏出现中文乱码
今天不知道在系统里装的哪个软件与Chrome浏览器所用的字体向冲突了,导致标题栏显示的中文都变成了乱码,其次收藏栏中的中文也变成了乱码.导致原有的收藏内容都无法辨认了.在网上搜索了一下,也有人遇到了相 ...