【模板】树状数组 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
【解题思路】
这题也是一道很不错的题目,是一道区间修改,单点查询的树状数组(单点修改区间查询)改编
这道题利用了差分数组的思想,差分数组就是记录后一个数减去前一个数记录在差分数组中(即为程序中的ADD)
这样区间修改(l,r)时即可在l上加上修改值,r+1上减去修改值即可
单点查询即可直接查询即可
【code】
1 // luogu-judger-enable-o2 2 #include <cstdio> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 int n,m; 7 int a[500005],c[500005]; 8 inline int lowbit(int x){ 9 return x&(-x); 10 } 11 inline int GetSum(int x){ 12 int ans=0; 13 for(register int i=x;i!=0;i-=lowbit(i)) 14 ans+=c[i]; 15 return ans; 16 } 17 inline void Add(int x,int y){ 18 for(register int i=x;i<=n;i+=lowbit(i)) 19 c[i]+=y; 20 return ; 21 } 22 int main(){ 23 //freopen("3368.in","r",stdin); 24 //freopen("3368.out","w",stdout); 25 scanf("%d%d",&n,&m); 26 for(register int i=1;i<=n;i++){ 27 scanf("%d",&a[i]); 28 Add(i,a[i]-a[i-1]); 29 } 30 int x,y,z,k; 31 for(register int i=1;i<=m;i++){ 32 scanf("%d",&x); 33 if(x==1){ 34 scanf("%d%d%d",&y,&z,&k); 35 Add(y,k); 36 Add(z+1,-k); 37 } 38 if(x==2){ 39 scanf("%d",&y); 40 printf("%d\n",GetSum(y)); 41 } 42 } 43 return 0; 44 }
Finished
转载于:https://www.cnblogs.com/66dzb/p/11195796.html
【模板】树状数组 2相关推荐
- [算法模板]树状数组
[算法模板]树状数组 思路 图片转自:yhf_2015--彻底理解树状数组 使用这个图片就能很快的理解树状数组. 我们可以先根据图片来分解一个十进制数成二次幂. example: \(15=2^0+1 ...
- 【luogu3368】模板 树状数组 2
题面 已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上x 2.求出某一个数的和 题解1 单点查询+区间修改. -.-说了树状数组模板那就用树状数组. 树状数组维护差分数列即可(差分前 ...
- 【luogu3374】模板 树状数组 1
题面 已知一个数列,你需要进行下面两种操作: 1.将某一个数加上x 2.求出某区间每一个数的和 题解1 单点修改+区间查询. 关于树状数组的理解,补上一点.位运算的操作其实对应的就是任意一个整数在二进 ...
- 模板——树状数组求逆序对
题目链接:https://www.luogu.org/problemnew/show/P1908 1 #include <map> 2 #include <set> 3 #in ...
- 模板三连击:树状数组+线段树+主席树
没事儿干,复习模板...... 1.树状数组 本来不想写这个的,但是反正就几分钟就打完了,所以就写了,水AC数. 洛谷 P3374 [模板]树状数组 1 1 #include<cstdio> ...
- 0x42.数据结构进阶 - 树状数组
目录 一.树状数组与逆序对 A.luogu P1908 逆序对(模板题) B.AcWing 241. 楼兰图腾 树状数组的拓展应用 1.区间加,求单点值 A.AcWing 242. 一个简单的整数问题 ...
- P3374 【模板】树状数组 1
P3374 [模板]树状数组 1 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示 ...
- 树状数组与离散化与求第K大模板
树状数组模板: //Cnt为数组的界 //cnt[i]为编号或者数值上小于id的数量 void Update(LL Id) {while(Id<=Cnt){cnt[Id]++;Id+=lowbi ...
- HDU1166 敌兵布阵(树状数组模板题)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- 树状数组求区间和模板 区间可修改 参考题目:牛客小白月赛 I 区间
从前有个东西叫树状数组,它可以轻易实现一些简单的序列操作,比如单点修改,区间求和;区间修改,单点求值等. 但是我们经常需要更高级的操作,比如区间修改区间查询.这时候树状数组就不起作用了,只能选择写一个 ...
最新文章
- 独家 | kaggle季军新手笔记:利用fast.ai对油棕人工林图像进行快速分类(附代码)...
- 图例放在图的外面_Origin做双Y轴箱型图(图文讲解)
- 安装node-sass时出现的错误解决方案(Mac自用,也可以借鉴)
- Codevs 1049 棋盘染色
- 关于CPU、指令集、架构、芯片概述
- 针对新手的Java EE7和Maven项目-第2部分-为我们的应用程序定义一场简单的战争
- python实现斐波那契数列
- asp.net mvc 路由检测工具
- 【BZOJ】【1096】【ZJOI2007】仓库建设
- Python基础第二十天:线程
- 两次称量误差多少为恒重_双台子100吨二手散装罐回收价格多少
- python装饰器详解-如何更通俗地讲解Python的装饰器?
- W Zong / A Robust Open-source Algorithm to Detect Onset and Duration of QRS Complexes
- HTML Agility Pack 搭配 ScrapySharp,彻底解除Html解析的痛苦
- thing.js入门学习
- java实现 -- 模板方法模式 -- 旅游签证
- web视频(点播/直播)播放器选型
- 程序猿段子_程序猿的24个段子,笑着笑着眼泪就出来了
- 设置<hr>标签的样式
- AXI协议详解(1)-协议简介
热门文章
- IT阅读——关于“业务”
- HDU-1698-Just a Hook
- SQLServer2005数据库自动备份
- Using NUnit with Visual Studio 2005 Express Editions
- ArcGIS Engine开发-TOCControl中实现图层的拖放
- ORB_SLAM2中的Sim3变换
- Ubuntu18.04运行ORB_SLAM2
- 《OpenCV3编程入门》学习笔记2 启程前的认知准备
- python gui界面设置数据储存在哪里_我整理的一些常用Python库!让你快速记住这些库的用法!建议收藏...
- sklearn库安装_没有依赖库也能跑机器学习模型!推荐一个强大工具m2cgen